def test_create_request_asset_perm(self): url = reverse('api-tickets:ticket-request-asset-perm') ticket_url = reverse('api-tickets:ticket') self.client.force_login(self.user_01) date_start = now() date_expired = date_start + datetime.timedelta(days=7) data = { "title": "request-01", "ips": [ "192.168.1.1" ], "date_start": date_start, "date_expired": date_expired, "hostname": "", "system_user": "", "org_id": self.org_01.id, "assignees": [ str(self.org_admin_01.id), str(self.org_admin_02.id), ] } self.client.post(data) self.client.force_login(self.org_admin_01) res = self.client.get(ticket_url, params={'assgin': 1})
def check_asset_permission_expired(): """ 这里的任务要足够短,不要影响周期任务 """ from settings.models import Setting setting_name = 'last_asset_perm_expired_check' end = now() default_start = end - timedelta(days=36000) # Long long ago in china defaults = {'value': dt_formater(default_start)} setting, created = Setting.objects.get_or_create( name=setting_name, defaults=defaults ) if created: start = default_start else: start = dt_parser(setting.value) setting.value = dt_formater(end) setting.save() asset_perm_ids = AssetPermission.objects.filter( date_expired__gte=start, date_expired__lte=end ).distinct().values_list('id', flat=True) asset_perm_ids = list(asset_perm_ids) logger.info(f'>>> checking {start} to {end} have {asset_perm_ids} expired') UserGrantedTreeRefreshController.add_need_refresh_by_asset_perm_ids_cross_orgs(asset_perm_ids)
def check_asset_permission_expired(): """ 这里的任务要足够短,不要影响周期任务 """ from settings.models import Setting setting_name = 'last_asset_perm_expired_check' end = now() default_start = end - timedelta(days=36000) # Long long ago in china defaults = {'value': dt_formater(default_start)} setting, created = Setting.objects.get_or_create(name=setting_name, defaults=defaults) if created: start = default_start else: start = dt_parser(setting.value) setting.value = dt_formater(end) setting.save() ids = AssetPermission.objects.filter( date_expired__gte=start, date_expired__lte=end).distinct().values_list('id', flat=True) logger.info(f'>>> checking {start} to {end} have {ids} expired') dispatch_process_expired_asset_permission.delay(list(ids))
def _generate_value(stage=lock.DOING): cur_thread = threading.current_thread() return VALUE_TEMPLATE.format(stage=stage, thread_name=cur_thread.name, thread_id=cur_thread.ident, now=dt_formater(now()), rand_str=uuid4())
def get_dingtalk_msg(self) -> dict: # 钉钉相同的消息一天只能发一次,所以给所有消息添加基于时间的序号,使他们不相同 message = self.text_msg['message'] suffix = _('\nTime: {}').format(now()) return { 'subject': self.text_msg['subject'], 'message': message + suffix }
def _generate_value(request: Request, stage=DOING): # 不支持匿名用户 user = request.user if user.is_anonymous: raise NotAuthenticated return VALUE_TEMPLATE.format( stage=stage, username=user.username, user_id=user.id, now=dt_formater(now()), rand_str=uuid4() )
def mark_msgs_as_read(cls, user_id, msg_ids): site_msg_users = SiteMessageUsers.objects.filter( user_id=user_id, sitemessage_id__in=msg_ids, has_read=False) for site_msg_user in site_msg_users: site_msg_user.has_read = True site_msg_user.read_at = now() SiteMessageUsers.objects.bulk_update(site_msg_users, fields=('has_read', 'read_at'))
def get_user_resources_q_granted_by_permissions(user: User): """ 获取用户关联的 asset permission 或者 用户组关联的 asset permission 获取规则, 前提 AssetPermission 对象中的 related_name 为 granted_by_permissions :param user: :return: """ _now = now() return reduce(and_, (Q(granted_by_permissions__date_start__lt=_now), Q(granted_by_permissions__date_expired__gt=_now), Q(granted_by_permissions__is_active=True), (Q(granted_by_permissions__users=user) | Q(granted_by_permissions__user_groups__users=user))))
def create_or_update_celery_periodic_tasks(tasks): """ :param tasks: { 'add-every-monday-morning': { 'task': 'tasks.add' # A registered celery task, 'interval': 30, 'crontab': "30 7 * * *", 'args': (16, 16), 'kwargs': {}, 'enabled': False, 'description': '' }, } :return: """ # Todo: check task valid, task and callback must be a celery task for name, detail in tasks.items(): interval = None crontab = None last_run_at = None try: IntervalSchedule.objects.all().count() except (ProgrammingError, OperationalError): return None if isinstance(detail.get("interval"), int): kwargs = dict( every=detail['interval'], period=IntervalSchedule.SECONDS, ) # 不能使用 get_or_create,因为可能会有多个 interval = IntervalSchedule.objects.filter(**kwargs).first() if interval is None: interval = IntervalSchedule.objects.create(**kwargs) last_run_at = now() elif isinstance(detail.get("crontab"), str): try: minute, hour, day, month, week = detail["crontab"].split() except ValueError: logger.error("crontab is not valid") return kwargs = dict(minute=minute, hour=hour, day_of_week=week, day_of_month=day, month_of_year=month, timezone=get_current_timezone()) crontab = CrontabSchedule.objects.filter(**kwargs).first() if crontab is None: crontab = CrontabSchedule.objects.create(**kwargs) else: logger.error("Schedule is not valid") return defaults = dict( interval=interval, crontab=crontab, name=name, task=detail['task'], enabled=detail.get('enabled', True), args=json.dumps(detail.get('args', [])), kwargs=json.dumps(detail.get('kwargs', {})), description=detail.get('description') or '', last_run_at=last_run_at, ) task = PeriodicTask.objects.update_or_create( defaults=defaults, name=name, ) PeriodicTasks.update_changed() return task