Exemplo n.º 1
0
class Analysis(models.Model):
    work_zone = models.ForeignKey('WorkZone',
                                  verbose_name='所属工作区',
                                  null=True,
                                  blank=True,
                                  on_delete=models.SET_NULL,
                                  related_name='analyses')
    project = models.ForeignKey('Project',
                                null=True,
                                blank=True,
                                on_delete=models.SET_NULL,
                                verbose_name='所属项目',
                                related_name='analyses')
    analysis_module = models.ForeignKey('AnalysisModule',
                                        null=True,
                                        blank=True,
                                        related_name='analyses',
                                        verbose_name='所属分析任务',
                                        on_delete=models.SET_NULL)
    serial_number = models.CharField(max_length=255, verbose_name='任务编号')
    command = models.CharField(max_length=255, verbose_name='运行命令')
    analysis_parameter = models.TextField(blank=True, verbose_name='分析参数详情')
    is_email = models.BooleanField(default=False, verbose_name='是否发送邮件')
    email_list = models.TextField(default='',
                                  null=True,
                                  blank=True,
                                  verbose_name='通知邮箱地址',
                                  help_text='逗号分割多个邮箱')
    status = models.IntegerField(
        default=10,
        choices=change_dict_for_model_choices(ANALYSIS_STATUS),
        null=True,
        blank=True,
        verbose_name='状态')
    process = models.CharField(max_length=255,
                               null=True,
                               blank=True,
                               verbose_name='进度')
    started_time = models.DateTimeField(null=True,
                                        blank=True,
                                        verbose_name='启动时间')
    finished_time = models.DateTimeField(null=True,
                                         blank=True,
                                         verbose_name='结束时间')
    remark = models.TextField(null=True, blank=True, verbose_name='备注')
    created_time = models.DateTimeField(default=timezone.now,
                                        verbose_name='创建日期')
    creator = models.ForeignKey('User',
                                null=True,
                                blank=True,
                                on_delete=models.SET_NULL,
                                verbose_name='创建者',
                                related_name='analyses')

    class Meta:
        verbose_name = '分析任务'
        verbose_name_plural = '分析任务'

    def __str__(self):
        return self.serial_number
Exemplo n.º 2
0
class WorkZoneMember(models.Model):
    work_zone = models.ForeignKey('WorkZone',
                                  verbose_name='所属工作区',
                                  on_delete=models.CASCADE,
                                  related_name='work_zone_members')
    user = models.ForeignKey('User',
                             verbose_name='所属用户',
                             on_delete=models.CASCADE,
                             related_name='work_zone_members')
    level = models.IntegerField(
        default=ZONE_GUEST,
        choices=change_dict_for_model_choices(MEMBER_TYPE),
        verbose_name='成员级别')
    remark = models.TextField(null=True, blank=True, verbose_name='备注/描述')
    created_time = models.DateTimeField(default=timezone.now,
                                        verbose_name='创建日期')
    creator = models.ForeignKey('User',
                                null=True,
                                blank=True,
                                on_delete=models.SET_NULL,
                                verbose_name='创建者',
                                related_name='creator_work_zone_members')

    class Meta:
        db_table = 'work_zone_member'
        verbose_name = '工作区成员'
        verbose_name_plural = '工作区成员'

    def __str__(self):
        return f'{self.work_zone.__str__()}@{self.user.__str__()}'
Exemplo n.º 3
0
class ActionLog(models.Model):
    object_type = models.ForeignKey('contenttypes.ContentType',
                                    related_name='type_action_logs',
                                    verbose_name="对象类型",
                                    blank=True,
                                    null=True,
                                    on_delete=models.SET_NULL)
    object_id = models.BigIntegerField(verbose_name="对象ID",
                                       blank=True,
                                       null=True,
                                       db_index=True)
    content_object = GenericForeignKey('object_type', 'object_id')
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             verbose_name="所属用户",
                             blank=True,
                             null=True,
                             on_delete=models.SET_NULL,
                             related_name='user_action_logs')
    action_type = models.IntegerField(
        verbose_name="操作类型",
        blank=True,
        null=True,
        choices=change_dict_for_model_choices(ACTION_TYPE))
    action_info = models.TextField(verbose_name="操作详情", blank=True, null=True)
    object_changes = models.TextField(blank=True,
                                      null=True,
                                      verbose_name="改变详情")
    remote_ip = models.GenericIPAddressField(verbose_name="请求IP地址",
                                             blank=True,
                                             null=True)
    remark = models.TextField(null=True, blank=True, verbose_name="备注")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建日期")

    objects = LogActionManager()

    class Meta:
        verbose_name = "操作日志"
        verbose_name_plural = "操作日志"

    def __str__(self):
        return f'{self.user}-{self.action_type}'

    def get_action_type_display(self):
        action_type = ACTION_TYPE.get(self.action_type, self.action_type)
        return action_type

    @property
    def object_changes_dict(self):
        """
        :return: The changes recorded in this log entry as a dictionary object.
        """
        try:
            return json.loads(self.object_changes)
        except ValueError:
            return {}
Exemplo n.º 4
0
class User(AbstractBaseUser, PermissionsMixin):
    """用户"""
    username = models.CharField(max_length=255,
                                unique=True,
                                db_index=True,
                                verbose_name='帐号')
    nickname = models.CharField(max_length=255, verbose_name='昵称')
    email = models.EmailField(max_length=255, verbose_name='邮箱')
    avatar = models.ImageField(default='avatar/default_avatar.jpg',
                               upload_to=upload_avatar_path,
                               blank=True,
                               null=True,
                               verbose_name='头像')
    phone = models.CharField(max_length=255,
                             blank=True,
                             null=True,
                             verbose_name='手机号码')
    gender = models.CharField(max_length=10,
                              default='男',
                              null=True,
                              blank=True,
                              verbose_name='性别')
    title = models.CharField(max_length=255,
                             blank=True,
                             null=True,
                             verbose_name='岗位职称')
    address = models.CharField(max_length=255,
                               null=True,
                               blank=True,
                               verbose_name='地址')
    remark = models.TextField(null=True, blank=True, verbose_name='简介/备注')
    created_time = models.DateTimeField(default=timezone.now,
                                        verbose_name='创建日期')
    is_deleted = models.BooleanField(default=False, verbose_name='是否已经删除')
    is_active = models.BooleanField(default=True, verbose_name='是否可用')
    role_level = models.IntegerField(
        default=USER,
        choices=change_dict_for_model_choices(ROLE_TYPE),
        verbose_name='用户等级')
    USERNAME_FIELD = 'username'  # 必须有一个唯一标识--USERNAME_FIELD
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = ['email']

    def save(self, *args, **kwargs):
        if not self.nickname:
            self.nickname = self.username
        super(User, self).save(*args, **kwargs)

    def __str__(self):
        return f'{self.nickname}({self.username})'

    @property
    def is_staff(self):
        if self.role_level >= SUPER_ADMIN:
            return True
        else:
            return False

    @property
    def role(self):
        return ROLE_TYPE.get(self.role_level, '')

    @property
    def role_zh(self):
        return ROLE_TYPE_ZH.get(self.role_level, '')

    class Meta:
        db_table = 'user'
        verbose_name = '用户'
        verbose_name_plural = '用户'

    objects = UserManager()
Exemplo n.º 5
0
class Notification(models.Model):
    object_type = models.ForeignKey(
        ContentType, null=True, blank=True,
        related_name='type_notifications', on_delete=models.CASCADE,
        verbose_name="对象类型")
    object_id = models.PositiveIntegerField(
        null=True, blank=True,
        verbose_name="对象ID")
    content_object = GenericForeignKey('object_type', 'object_id')
    level = models.PositiveIntegerField(choices=change_dict_for_model_choices(NOTIFY_LEVEL), default=NOTIFY_INFO,
                                        verbose_name="消息级别")
    recipient = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='recipient_notifications',
                                  on_delete=models.CASCADE, verbose_name="接收者")
    sender = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name='sender_notifications',
                               on_delete=models.CASCADE, verbose_name="发送者", help_text='当消息为系统发出时为空')
    title = models.CharField(max_length=255, verbose_name="消息标题")
    content = models.TextField(blank=True, verbose_name="具体消息内容")
    remark = models.TextField(null=True, blank=True, verbose_name="备注")
    created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    is_read = models.BooleanField(default=False, verbose_name="是否已读")
    is_deleted = models.BooleanField(default=False, verbose_name="是否已删除")
    is_important = models.BooleanField(default=False, verbose_name="是否重要邮件")

    objects = NotificationQueryset.as_manager()

    class Meta(object):
        verbose_name = "通知消息"
        verbose_name_plural = "通知消息"

    def __str__(self):
        return f'{self.title} at {timesince(self.created_time)}'

    def mark_as_read(self):
        self.is_read = True
        self.save()

    def mark_as_unread(self):
        self.is_read = False
        self.save()

    def mark_as_deleted(self):
        self.is_deleted = True
        self.save()

    def mark_as_active(self):
        self.is_deleted = False
        self.save()

    def mark_as_important(self):
        self.is_important = True
        self.save()

    def mark_as_unimportant(self):
        self.is_important = False
        self.save()

    @cached_property
    def object(self):
        return self.content_object

    @staticmethod
    def do_escape(obj):
        return escape(force_text(obj)) if obj else None
Exemplo n.º 6
0
class AnalysisModule(models.Model):
    module_type = models.IntegerField(
        choices=change_dict_for_model_choices(ANALYSIS_MODULE_TYPE),
        verbose_name='模块类型')
    name = models.CharField(max_length=255, verbose_name='模块名称')
    command = models.CharField(max_length=255, verbose_name='运行命令')
    url = models.CharField(null=True,
                           blank=True,
                           max_length=255,
                           verbose_name='git链接路径')
    pipeline_file = models.FileField(null=True,
                                     blank=True,
                                     upload_to=upload_module_path,
                                     verbose_name='模块主流程文件')
    version = models.CharField(max_length=255,
                               null=True,
                               blank=True,
                               verbose_name='版本号/分支名')
    developer = models.CharField(max_length=255,
                                 null=True,
                                 blank=True,
                                 verbose_name='开发者')
    email = models.CharField(max_length=255,
                             null=True,
                             blank=True,
                             verbose_name='开发者邮箱')
    status = models.IntegerField(
        default=10,
        choices=change_dict_for_model_choices(ANALYSIS_MODULE_STATUS),
        null=True,
        blank=True,
        verbose_name='状态')
    remark = models.TextField(null=True, blank=True, verbose_name='备注')
    created_time = models.DateTimeField(default=timezone.now,
                                        verbose_name='创建日期')
    creator = models.ForeignKey('User',
                                null=True,
                                blank=True,
                                on_delete=models.SET_NULL,
                                verbose_name='创建者',
                                related_name='analysis_modules')

    class Meta:
        verbose_name = '分析模块'
        verbose_name_plural = '分析模块'

    def __str__(self):
        return self.name

    @property
    def file_path(self):
        data_path = ''
        if self.module_type == GIT:
            version_split = self.version.split('/')
            version_type = version_split[1]
            version = version_split[2]
            base_path = create_or_get_directory(
                os.path.join(settings.MEDIA_ROOT, 'AnalysisModule'))
            data_path = create_or_get_directory(
                os.path.join(base_path, self.name, version_type, version))
        if self.module_type == LOCAL:
            data_path = os.path.dirname(self.pipeline_file.path)
        return data_path

    @property
    def file_uri(self):
        data_path = ''
        if self.module_type == GIT:
            version_split = self.version.split('/')
            version_type = version_split[1]
            version = version_split[2]
            base_path = os.path.join(settings.MEDIA_URL, 'AnalysisModule')
            data_path = os.path.join(base_path, self.name, version_type,
                                     version)
        if self.module_type == LOCAL:
            data_path = os.path.dirname(self.pipeline_file.url)
        return data_path
Exemplo n.º 7
0
class DataSet(models.Model):
    work_zone = models.ForeignKey('WorkZone',
                                  verbose_name='所属工作区',
                                  null=True,
                                  blank=True,
                                  on_delete=models.SET_NULL,
                                  related_name='dataset')
    serial_number = models.CharField(max_length=255, verbose_name='文件编号')
    directory_path = models.CharField(default='',
                                      max_length=255,
                                      verbose_name='目录路径')
    file_name = models.CharField(max_length=255, verbose_name='文件名称')
    data_type = models.IntegerField(
        default=PUBLIC_DATA,
        choices=change_dict_for_model_choices(DATASET_TYPE),
        verbose_name='数据类型')
    file_type = models.IntegerField(
        default=FILE,
        choices=change_dict_for_model_choices(FILE_TYPE),
        verbose_name='文件类型')
    source_type = models.IntegerField(
        default=UPLOAD,
        choices=change_dict_for_model_choices(SOURCE_TYPE),
        verbose_name='文件来源')
    file_size = models.IntegerField(default=0, verbose_name='文件大小(KB)')
    uploaded = models.BooleanField(default=False, verbose_name='是否完整上传')
    file_md5 = models.CharField(default='',
                                max_length=255,
                                verbose_name='文件MD5')
    uploaded_chunks = models.TextField(default='', verbose_name='已上传的分块(逗号分割)')
    total_chunks = models.IntegerField(default=0, verbose_name='文件总分片数')
    download_url = models.URLField(null=True,
                                   blank=True,
                                   verbose_name='离线上传链接')
    created_time = models.DateTimeField(default=timezone.now,
                                        verbose_name='创建日期')
    edit_time = models.DateTimeField(default=timezone.now, verbose_name='修改日期')
    remark = models.TextField(null=True, blank=True, verbose_name='备注/描述')
    creator = models.ForeignKey('User',
                                null=True,
                                blank=True,
                                on_delete=models.SET_NULL,
                                verbose_name='创建者',
                                related_name='dataset')

    class Meta:
        verbose_name = '文件数据'
        verbose_name_plural = '文件数据'

    def __str__(self):
        if not self.file_md5:
            return self.serial_number
        return self.file_md5

    def save(self, *args, **kwargs):
        if not self.pk:
            self.serial_number = str(uuid.uuid1())
        super(DataSet, self).save(*args, **kwargs)

    @property
    def directory_full_path(self, *args, **kwargs):
        if self.work_zone:
            work_zone_id = self.work_zone.id
        else:
            work_zone_id = None
        data_path = get_data_directory_path(data_type=self.data_type,
                                            current_path=self.directory_path,
                                            work_zone_id=work_zone_id)
        return data_path

    @property
    def file_full_path(self, *args, **kwargs):
        return os.path.join(self.directory_full_path, self.file_name)

    @property
    def file_uri(self, *args, **kwargs):
        # 若不是公共数据, 则数据保存在工作区下
        if self.work_zone_id:
            work_zone_id = self.work_zone.id
        else:
            work_zone_id = None
        data_uri = get_data_uri(data_type=self.data_type,
                                current_path=self.directory_path,
                                work_zone_id=work_zone_id,
                                file_name=self.file_name)
        return data_uri

    @property
    def relative_path(self):
        return os.path.join(self.directory_path, self.file_name)