Esempio n. 1
0
    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})
Esempio n. 2
0
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)
Esempio n. 3
0
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))
Esempio n. 4
0
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())
Esempio n. 5
0
    def get_dingtalk_msg(self) -> dict:
        # 钉钉相同的消息一天只能发一次,所以给所有消息添加基于时间的序号,使他们不相同
        message = self.text_msg['message']
        suffix = _('\nTime: {}').format(now())

        return {
            'subject': self.text_msg['subject'],
            'message': message + suffix
        }
Esempio n. 6
0
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()
    )
Esempio n. 7
0
    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'))
Esempio n. 8
0
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))))
Esempio n. 9
0
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