feature: adds schedule/unschedule AD users sync.

This commit is contained in:
ievgenii vdovenko 2025-07-14 12:18:05 +02:00
parent b783ff6689
commit c0201a85a8
2 changed files with 58 additions and 1 deletions

View file

@ -28,6 +28,7 @@ from rhodecode.apps._base import BaseAppView
from rhodecode.authentication.base import get_authn_registry
from rhodecode.lib import helpers as h
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator, CSRFRequired
from rhodecode.lib.celerylib import run_task, tasks
from rhodecode.model.forms import AuthSettingsForm
from rhodecode.model.meta import Session
from rhodecode.model.settings import SettingsModel
@ -90,6 +91,9 @@ class AuthnPluginViewBase(BaseAppView):
# Store validated data.
for name, value in valid_data.items():
self.plugin.create_or_update_setting(name, value)
if name == "sync_active_directory_users":
self._handle_ad_users_sync_schedule(name, value)
Session().commit()
SettingsModel().invalidate_settings_cache()
@ -102,6 +106,17 @@ class AuthnPluginViewBase(BaseAppView):
return HTTPFound(redirect_to)
def _handle_ad_users_sync_schedule(self, name: str, enabled: bool):
if name != "sync_active_directory_users":
return
if enabled:
log.debug("Scheduling AD users sync")
run_task(tasks.schedule_sync_ldap_ad_users_producer)
else:
log.debug("Removing schedule for AD users sync")
run_task(tasks.unschedule_sync_ldap_ad_users_producer)
class AuthSettingsView(BaseAppView):
def load_default_context(self):

View file

@ -24,6 +24,7 @@ by celery daemon
import os
import time
from celery import current_app
from pyramid_mailer.mailer import Mailer
from pyramid_mailer.message import Message
from email.utils import formatdate
@ -35,7 +36,7 @@ from rhodecode.lib import hooks_base
from rhodecode.lib.utils import adopt_for_celery
from rhodecode.lib.utils2 import safe_int, str2bool, aslist
from rhodecode.lib.statsd_client import StatsdClient
from rhodecode.model.db import true, null, Session, IntegrityError, Repository, RepoGroup, User
from rhodecode.model.db import true, null, Session, IntegrityError, Repository, RepoGroup, User, ScheduleEntry
from rhodecode.model.permission import PermissionModel
@ -417,6 +418,47 @@ def beat_check(*args, **kwargs):
return time.time()
@async_task(ignore_result=True)
def schedule_sync_ldap_ad_users_producer():
log = get_logger(schedule_sync_ldap_ad_users_producer)
try:
from rc_ee.lib.celerylib.scheduler import RcScheduler
except ImportError:
log.error("Attempt to schedule EE feature")
return
scheduler = RcScheduler(app=current_app)
scheduler.sync()
task_name = "rc_ee.lib.celerylib.tasks.sync_ldap_ad_users_producer"
if task_name not in scheduler.schedule:
entries = {
task_name: {
"task": task_name,
"schedule_type": "crontab",
"schedule_value": {"hour": 0, "minute": 4},
"options": {"expires": 12 * 3600},
}
}
scheduler.update_from_dict(entries)
@async_task(ignore_result=True)
def unschedule_sync_ldap_ad_users_producer():
log = get_logger(unschedule_sync_ldap_ad_users_producer)
try:
from rc_ee.lib.celerylib.scheduler import RcScheduler
except ImportError:
log.error("Attempt to unschedule EE feature")
return
task_name = "rc_ee.lib.celerylib.tasks.sync_ldap_ad_users_producer"
existing_task = ScheduleEntry.query().filter(ScheduleEntry.task_dot_notation == task_name).first()
if existing_task:
Session().delete(existing_task)
@async_task
@adopt_for_celery
def repo_size(extras):