예제 #1
0
class BaseAdmin(DjangoObjectActions, admin.ModelAdmin):
    def undo(self, request, obj):
        obj.undo()

    undo.label = _('Undo')
    undo.short_description = _('Revert this object to previous version.')

    change_actions = ('undo', )
예제 #2
0
 def get_choices(cls):
     return {
         cls.company: _('company'),
         cls.government: _('government'),
         cls.media: _('media'),
         cls.finance: _('finance'),
         cls.energy_and_raw_materials: _('energy_and_raw_materials'),
     }
예제 #3
0
class Article(PermsMixin, AutoCleanMixin, models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL,
                               verbose_name=_('author'))
    title = models.CharField(_('title'), max_length=255)
    tags = models.ManyToManyField('Tag', verbose_name=_('tags'), blank=True)
    summary = models.TextField(_('summary'), blank=True)
    content = models.TextField(_('content'))
    is_top = models.BooleanField(_('is top'), default=False)
    created_time = models.DateTimeField(_('created'), auto_now_add=True)
    attachments = models.ManyToManyField('files.File',
                                         verbose_name=_('attachments'),
                                         blank=True)
    article_type = EnumField(
        ArticleType,
        verbose_name=_('article type'),
        default=ArticleType.government,
    )

    def _clean_type(self):
        self.article_type = ArticleType.from_user(self.author)

    def _clean_content(self):
        from enhancements.utils.html import standardize, summarize

        self.content = standardize(self.content)
        self.summary = summarize(self.content)

    def clean(self):
        self._clean_type()
        self._clean_content()

    def get_absolute_url(self):
        return '/detail/articles/{0}/'.format(self.id)
예제 #4
0
class AbstractUser(auth_models.AbstractBaseUser, auth_models.PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """
    username = models.CharField(
        _('username'),
        max_length=30,
        unique=True,
        help_text=
        _('Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.'
          ),
        validators=[
            validators.RegexValidator(
                r'^[\w.@+-]+$',
                _('Enter a valid username. This value may contain only '
                  'letters, numbers '
                  'and @/./+/-/_ characters.')),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        abstract = True

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        pass

    def get_short_name(self):
        "Returns the short name for the user."
        pass
예제 #5
0
class UserData(models.Model):

    name = models.CharField(_('name'), max_length=255, blank=True)
    industry = models.CharField(_('industry'), max_length=255, blank=True)
    sector = models.CharField(_('sector'), max_length=255, blank=True)
    description = models.TextField(_('description'), blank=True)
    reports = models.ManyToManyField(
        'files.File', verbose_name=_('reports'), blank=True)

    class Meta:
        verbose_name = _('user data')
        verbose_name_plural = _('user data')
예제 #6
0
class Comment(models.Model):

    created_time = models.DateTimeField(_('created time'), auto_now_add=True)
    content = models.TextField(_('content'))
    stock = models.ForeignKey('Stock', related_name='comments', null=True)

    def __str__(self):
        return _('comment %s') % self.id

    class Meta:
        verbose_name = _('comment')
        verbose_name_plural = _('comments')
예제 #7
0
class Reply(AutoURLMixin, FilterContentMixin, models.Model):
    topic = models.ForeignKey('Topic', verbose_name=_('topic'))
    created_time = models.DateTimeField(_('created time'), auto_now_add=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL,
                               verbose_name=_('author'))
    content = models.TextField(_('content'))
    attachments = models.ManyToManyField('files.File',
                                         verbose_name=_('attachments'))

    class Meta:
        verbose_name_plural = _('replies')
        verbose_name = _('reply')

    def get_absolute_url(self):
        return '/detail/topics/{0}/'.format(self.topic.id)
예제 #8
0
class User(AutoCleanMixin, PermsMixin, AbstractUser):

    nickname = models.CharField(_('nickname'), max_length=255, unique=True)
    user_type = EnumField(UserType,
                          verbose_name=_('user type'),
                          default=UserType.company,
                          editable=True)
    bureau_type = EnumField(BureauType,
                            verbose_name=_('bureau type'),
                            default=BureauType.none,
                            editable=True)
    user_data = models.OneToOneField('UserData',
                                     verbose_name=_('user data'),
                                     null=True,
                                     blank=True)

    objects = UserManager()

    REQUIRED_FIELDS = ['nickname']

    INVISIBLE_FIELDS = {'accounts.view_userdata': ['user_data']}

    def _clean_bureau_type(self):
        if self.user_type != UserType.bureau:
            self.bureau_type = BureauType.none

    def _check_user_data(self):
        if self.user_type == UserType.company:
            if self.user_data is None:
                self.user_data = UserData.objects.create()
                self.save()
        elif self.user_data is not None:
            self.user_data.delete()

    def clean(self):
        self._clean_bureau_type()
        self._check_user_data()

    @property
    def category(self):
        """
        Return a (user_type, bureau_type) tuple.

        Returns:
            tuple
        """
        return (UserType(self.user_type), BureauType(self.bureau_type))
예제 #9
0
 def get_choices(cls):
     return {
         cls.company: _('company'),
         cls.government: _('government'),
         cls.media: _('media'),
         cls.finance: _('finance'),
         cls.energy_and_raw_materials: _('energy_and_raw_materials'),
         cls.electronic_technology: _('electronic_technology'),
         cls.bank: _('bank'),
         cls.real_estate: _('real_estate')
     }
예제 #10
0
 def get_choices(cls):
     return {
         cls.company: _('company'),
         cls.government: _('government'),
         cls.media: _('media'),
         cls.finance: _('finance'),
         cls.energy_and_raw_materials: _('energy_and_raw_materials'),
         cls.electronic_technology: _('electronic_technology'),
         cls.bank: _('bank'),
         cls.real_estate: _('real_estate')
     }
예제 #11
0
 def get_choices(cls):
     return {
         cls.none: _('none'),
         cls.real_estate: _('real_estate'),
         cls.car: _('car'),
         cls.electronic_technology: _('electronic_technology'),
         cls.bank: _('bank'),
         cls.energy_and_raw_materials: _('energy_and_raw_materials'),
         cls.financial_system: _('financial_system'),
         cls.media: _('media'),
     }
예제 #12
0
 def get_choices(cls):
     return {
         cls.none: _('none'),
         cls.real_estate: _('real_estate'),
         cls.car: _('car'),
         cls.electronic_technology: _('electronic_technology'),
         cls.bank: _('bank'),
         cls.energy_and_raw_materials: _('energy_and_raw_materials'),
         cls.financial_system: _('financial_system'),
         cls.media: _('media'),
     }
예제 #13
0
class Notification(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             verbose_name=_('receiver'),
                             related_name='notifications')
    template = models.TextField()
    created_time = models.DateTimeField(auto_now_add=True)
    data = JSONField()
    has_read = models.BooleanField(default=False)
    url = models.URLField(_('URL'))

    target_id = models.PositiveIntegerField(null=True)
    target_content_type = models.ForeignKey(
        'contenttypes.ContentType', null=True)
    target = contenttypes_fields.GenericForeignKey(
        'target_content_type',
        'target_id'
    )

    module = models.CharField(_('module'), max_length=255)

    objects = NotificationQuerySet.as_manager()

    @property
    def message(self):
        if hasattr(self, '_message'):
            return self._message

        from . import formatter
        self._message = formatter.render(self.template, self.data)

        return self._message

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

    def __str__(self):
        return self.message
예제 #14
0
class UserAdmin(DjangoObjectActions, auth_admin.UserAdmin,
                ObjectPermissionsModelAdmin):
    fieldsets = ((None, {'fields': ('username', 'nickname', 'bureau_type')}), )
    add_fieldsets = ((None, {
        'classes': ('wide', ),
        'fields': ('username', 'nickname', 'user_type', 'bureau_type',
                   'password1', 'password2'),
    }), )
    list_display = ('username', 'nickname', 'user_type', 'bureau_type')
    list_filter = ()
    search_fields = ('username', )
    ordering = ('username', )

    def change_password(self, request, user):
        from django.http import HttpResponseRedirect

        return HttpResponseRedirect('../../password/')

    change_password.label = _('Change Password')
    change_password.short_description = _(
        'Click here to change your password.')

    change_actions = ['change_password']
예제 #15
0
class UserAdmin(DjangoObjectActions, auth_admin.UserAdmin,
                ObjectPermissionsModelAdmin):
    fieldsets = ((None, {'fields': ('username', 'nickname')}), )
    add_fieldsets = ((None, {
        'classes': ('wide', ),
        'fields':
        ('username', 'nickname', 'user_type', 'password1', 'password2'),
    }), )
    list_display = ('username', 'nickname', 'is_staff')
    list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
    search_fields = ('username', )
    ordering = ('username', )
    filter_horizontal = (
        'groups',
        'user_permissions',
    )

    # inlines = []

    # def get_inline_instances(self, request, obj=None):
    #     if obj is not None and obj.user_type == UserType.company.value:
    #         self.inlines = [UserDataInline]
    #     else:
    #         self.inlines = []

    #     return super(UserAdmin, self).get_inline_instances(request, obj)

    def change_password(self, request, user):
        from django.http import HttpResponseRedirect

        return HttpResponseRedirect('../../password/')

    change_password.label = _('Change Password')
    change_password.short_description = _(
        'Click here to change your password.')

    change_actions = ['change_password']
예제 #16
0
class Topic(AutoURLMixin, LockMixin, FilterContentMixin, models.Model):
    asker = models.ForeignKey(settings.AUTH_USER_MODEL,
                              verbose_name=_('asker'))
    title = models.CharField(
        _('title'),
        max_length=1000,
    )
    content = models.TextField(_('content'))
    created_time = models.DateTimeField(_('created time'), auto_now_add=True)
    updated_time = models.DateTimeField(_('updated time'), auto_now_add=True)
    is_closed = models.BooleanField(_('is closed'), default=False)
    replies_count = models.IntegerField(_('replies count'), default=0)
    attachments = models.ManyToManyField('files.File',
                                         verbose_name=_('attachments'))

    def __init__(self, *args, **kwargs):
        super(Topic, self).__init__(*args, **kwargs)

        self.updating_lock = self.locks['updating']

    def _notify_close_open(self, action, executer):
        notifier.select('{0}_topic'.format(action)).send(
            user=User.objects.governments_or(
                self.asker).exclude(pk=executer.pk),
            target=self)

    def close(self, executer):
        self.is_closed = True
        self.updating_lock.lock()
        self._notify_close_open('close', executer)
        self.save()

    def open(self, executer):
        self.is_closed = False
        self.updating_lock.lock()
        self._notify_close_open('open', executer)
        self.save()

    class Meta:
        verbose_name = _('topic')
        verbose_name_plural = _('topics')

    def get_absolute_url(self):
        return '/detail/topics/{0}/'.format(self.id)
예제 #17
0
class File(AutoCleanMixin, models.Model):

    path = models.CharField(_('file path'), max_length=4096)
    file_name = models.CharField(_('file name'), max_length=4096, blank=True)
    storage_url = models.URLField(_('url'), blank=True)
    created_time = models.DateTimeField(_('created time'), auto_now_add=True)
    mime_type = models.CharField(_('mime type'), max_length=255, blank=True)
    file_type = EnumField(consts.FileType,
                          verbose_name=_('file type'),
                          default=consts.FileType.file)

    def clean(self):
        if not self.path:
            raise ValidationError('path cannot be blank.')

        self.mime_type = utils.get_mime_type(self.path)
        self.file_name = os.path.basename(self.path)
        self.file_type = consts.FileType.get_by_mime_type(self.mime_type)
        self.storage_url = urlunsplit(
            ('http', utils.domain_name, self.path, '', ''))
예제 #18
0
 class Meta:
     verbose_name = _('user')
     verbose_name_plural = _('users')
     abstract = True
예제 #19
0
 class Meta:
     verbose_name = _('comment')
     verbose_name_plural = _('comments')
예제 #20
0
 def __str__(self):
     return _('comment %s') % self.id
예제 #21
0
    created_time = models.DateTimeField(_('created time'), auto_now_add=True)
    content = models.TextField(_('content'))
    stock = models.ForeignKey('Stock', related_name='comments', null=True)

    def __str__(self):
        return _('comment %s') % self.id

    class Meta:
        verbose_name = _('comment')
        verbose_name_plural = _('comments')


Stock, StockLog = create_revision_model(
    'Stock',
    dict(name=models.CharField(_('name'), max_length=255),
         price=models.FloatField(_('price')),
         volume=models.FloatField(_('volume')),
         company_info=models.TextField(_('company info'))),
    ['price', 'volume'],
    __name__,
    meta=type('Meta', (), {
        'verbose_name': _('stock'),
        'verbose_name_plural': _('stocks')
    }))

Bond, BondLog = create_revision_model(
    'Bond',
    dict(issuer=models.CharField(_('issuer'), max_length=255),
         name=models.CharField(_('name'), max_length=255),
         quantity=models.FloatField(_('quantity')),
예제 #22
0
 def _clean_bureau_type(self):
     if self.user_type != UserType.bureau and \
             self.bureau_type != BureauType.none:
         raise ValidationError({
             'bureau_type': _('non-bureau user cannot have bureau type')
         })
예제 #23
0
 class Meta:
     verbose_name = _('user data')
     verbose_name_plural = _('user data')
예제 #24
0
class Tag(models.Model):
    name = models.CharField(_('name'), max_length=255, unique=True)

    def get_absolute_url(self):
        return '/tags/{0}/'.format(self.id)
예제 #25
0
 def get_choices(cls):
     return {
         cls.video: _('video'),
         cls.image: _('image'),
         cls.file: _('file')
     }
예제 #26
0
class FinanceConfig(AppConfig):
    name = 'finance'
    verbose_name = _('Finance System')
예제 #27
0
 class Meta:
     verbose_name = _('topic')
     verbose_name_plural = _('topics')
예제 #28
0
 def get_choices(cls):
     return {
         cls.government: _('government'),
         cls.company: _('company'),
         cls.bureau: _('bureau'),
     }
예제 #29
0
 class Meta:
     verbose_name_plural = _('replies')
     verbose_name = _('reply')
예제 #30
0
 def get_choices(cls):
     return {
         cls.government: _('government'),
         cls.company: _('company'),
         cls.bureau: _('bureau'),
     }