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', )
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'), }
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)
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
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')
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')
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)
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))
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') }
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') }
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'), }
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'), }
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
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']
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']
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)
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, '', ''))
class Meta: verbose_name = _('user') verbose_name_plural = _('users') abstract = True
class Meta: verbose_name = _('comment') verbose_name_plural = _('comments')
def __str__(self): return _('comment %s') % self.id
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')),
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') })
class Meta: verbose_name = _('user data') verbose_name_plural = _('user data')
class Tag(models.Model): name = models.CharField(_('name'), max_length=255, unique=True) def get_absolute_url(self): return '/tags/{0}/'.format(self.id)
def get_choices(cls): return { cls.video: _('video'), cls.image: _('image'), cls.file: _('file') }
class FinanceConfig(AppConfig): name = 'finance' verbose_name = _('Finance System')
class Meta: verbose_name = _('topic') verbose_name_plural = _('topics')
def get_choices(cls): return { cls.government: _('government'), cls.company: _('company'), cls.bureau: _('bureau'), }
class Meta: verbose_name_plural = _('replies') verbose_name = _('reply')
def get_choices(cls): return { cls.government: _('government'), cls.company: _('company'), cls.bureau: _('bureau'), }