models.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import json
  2. import django
  3. from django.db import models
  4. from django.utils import timezone
  5. from django.conf import settings
  6. from django.contrib.contenttypes.models import ContentType
  7. from django.utils.translation import ugettext_lazy as _, ugettext
  8. from django.urls.base import reverse
  9. from django.core.serializers.json import DjangoJSONEncoder
  10. from django.db.models.base import ModelBase
  11. from django.utils.encoding import python_2_unicode_compatible, smart_text
  12. from django.db.models.signals import post_migrate
  13. from django.contrib.auth.models import Permission
  14. import datetime
  15. import decimal
  16. from xadmin.util import quote
  17. AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
  18. def add_view_permissions(sender, **kwargs):
  19. """
  20. This syncdb hooks takes care of adding a view permission too all our
  21. content types.
  22. """
  23. # for each of our content types
  24. for content_type in ContentType.objects.all():
  25. # build our permission slug
  26. codename = "view_%s" % content_type.model
  27. # if it doesn't exist..
  28. if not Permission.objects.filter(content_type=content_type, codename=codename):
  29. # add it
  30. Permission.objects.create(content_type=content_type,
  31. codename=codename,
  32. name="Can view %s" % content_type.name)
  33. # print "Added view permission for %s" % content_type.name
  34. # check for all our view permissions after a syncdb
  35. post_migrate.connect(add_view_permissions)
  36. @python_2_unicode_compatible
  37. class Bookmark(models.Model):
  38. title = models.CharField(_(u'Title'), max_length=128)
  39. user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_(u"user"), blank=True, null=True)
  40. url_name = models.CharField(_(u'Url Name'), max_length=64)
  41. content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
  42. query = models.CharField(_(u'Query String'), max_length=1000, blank=True)
  43. is_share = models.BooleanField(_(u'Is Shared'), default=False)
  44. @property
  45. def url(self):
  46. base_url = reverse(self.url_name)
  47. if self.query:
  48. base_url = base_url + '?' + self.query
  49. return base_url
  50. def __str__(self):
  51. return self.title
  52. class Meta:
  53. verbose_name = _(u'Bookmark')
  54. verbose_name_plural = _('Bookmarks')
  55. class JSONEncoder(DjangoJSONEncoder):
  56. def default(self, o):
  57. if isinstance(o, datetime.datetime):
  58. return o.strftime('%Y-%m-%d %H:%M:%S')
  59. elif isinstance(o, datetime.date):
  60. return o.strftime('%Y-%m-%d')
  61. elif isinstance(o, decimal.Decimal):
  62. return str(o)
  63. elif isinstance(o, ModelBase):
  64. return '%s.%s' % (o._meta.app_label, o._meta.model_name)
  65. else:
  66. try:
  67. return super(JSONEncoder, self).default(o)
  68. except Exception:
  69. return smart_text(o)
  70. @python_2_unicode_compatible
  71. class UserSettings(models.Model):
  72. user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_(u"user"))
  73. key = models.CharField(_('Settings Key'), max_length=256)
  74. value = models.TextField(_('Settings Content'))
  75. def json_value(self):
  76. return json.loads(self.value)
  77. def set_json(self, obj):
  78. self.value = json.dumps(obj, cls=JSONEncoder, ensure_ascii=False)
  79. def __str__(self):
  80. return "%s %s" % (self.user, self.key)
  81. class Meta:
  82. verbose_name = _(u'User Setting')
  83. verbose_name_plural = _('User Settings')
  84. @python_2_unicode_compatible
  85. class UserWidget(models.Model):
  86. user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_(u"user"))
  87. page_id = models.CharField(_(u"Page"), max_length=256)
  88. widget_type = models.CharField(_(u"Widget Type"), max_length=50)
  89. value = models.TextField(_(u"Widget Params"))
  90. def get_value(self):
  91. value = json.loads(self.value)
  92. value['id'] = self.id
  93. value['type'] = self.widget_type
  94. return value
  95. def set_value(self, obj):
  96. self.value = json.dumps(obj, cls=JSONEncoder, ensure_ascii=False)
  97. def save(self, *args, **kwargs):
  98. created = self.pk is None
  99. super(UserWidget, self).save(*args, **kwargs)
  100. if created:
  101. try:
  102. portal_pos = UserSettings.objects.get(
  103. user=self.user, key="dashboard:%s:pos" % self.page_id)
  104. portal_pos.value = "%s,%s" % (self.pk, portal_pos.value) if portal_pos.value else self.pk
  105. portal_pos.save()
  106. except Exception:
  107. pass
  108. def __str__(self):
  109. return "%s %s widget" % (self.user, self.widget_type)
  110. class Meta:
  111. verbose_name = _(u'User Widget')
  112. verbose_name_plural = _('User Widgets')
  113. @python_2_unicode_compatible
  114. class Log(models.Model):
  115. action_time = models.DateTimeField(
  116. _('action time'),
  117. default=timezone.now,
  118. editable=False,
  119. )
  120. user = models.ForeignKey(
  121. AUTH_USER_MODEL,
  122. models.CASCADE,
  123. verbose_name=_('user'),
  124. )
  125. ip_addr = models.GenericIPAddressField(_('action ip'), blank=True, null=True)
  126. content_type = models.ForeignKey(
  127. ContentType,
  128. models.SET_NULL,
  129. verbose_name=_('content type'),
  130. blank=True, null=True,
  131. )
  132. object_id = models.TextField(_('object id'), blank=True, null=True)
  133. object_repr = models.CharField(_('object repr'), max_length=200)
  134. action_flag = models.CharField(_('action flag'), max_length=32)
  135. message = models.TextField(_('change message'), blank=True)
  136. class Meta:
  137. verbose_name = _('log entry')
  138. verbose_name_plural = _('log entries')
  139. ordering = ('-action_time',)
  140. def __repr__(self):
  141. return smart_text(self.action_time)
  142. def __str__(self):
  143. if self.action_flag == 'create':
  144. return ugettext('Added "%(object)s".') % {'object': self.object_repr}
  145. elif self.action_flag == 'change':
  146. return ugettext('Changed "%(object)s" - %(changes)s') % {
  147. 'object': self.object_repr,
  148. 'changes': self.message,
  149. }
  150. elif self.action_flag == 'delete' and self.object_repr:
  151. return ugettext('Deleted "%(object)s."') % {'object': self.object_repr}
  152. return self.message
  153. def get_edited_object(self):
  154. "Returns the edited object represented by this log entry"
  155. return self.content_type.get_object_for_this_type(pk=self.object_id)