拍爱

models.py 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. # -*- coding: utf-8 -*-
  2. from django.conf import settings
  3. from django.db import models
  4. from django.utils.translation import ugettext_lazy as _
  5. from pai2.basemodels import CreateUpdateMixin
  6. from utils.redis.rgroup import get_group_photo_thumbup_flag
  7. from utils.redis.rorder import get_lensman_order_record
  8. from utils.time_utils import origin_expired_stamps
  9. from utils.url_utils import img_url, share_url
  10. r = settings.REDIS_CACHE
  11. class GroupInfo(CreateUpdateMixin):
  12. APP_GROUP = 0
  13. SESSION_GROUP = 1
  14. GROUP_FROM = (
  15. (APP_GROUP, u'APP 建群'),
  16. (SESSION_GROUP, u'SESSION 建群'),
  17. )
  18. group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True, unique=True)
  19. admin_id = models.CharField(_(u'admin_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  20. group_name = models.CharField(_(u'group_name'), max_length=255, blank=True, null=True, help_text=u'群组名称')
  21. group_default_avatar = models.IntegerField(_(u'group_default_avatar'), default=0, help_text=u'群组默认头像,0 - 255,水果头像')
  22. group_avatar = models.CharField(_(u'group_avatar'), max_length=255, blank=True, null=True, help_text=u'群组头像')
  23. group_desc = models.TextField(_(u'group_desc'), blank=True, null=True, help_text=u'群组描述')
  24. group_from = models.IntegerField(_(u'group_from'), choices=GROUP_FROM, default=APP_GROUP, help_text=u'群组来源')
  25. session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识', db_index=True)
  26. group_lock = models.BooleanField(_(u'group_lock'), default=False, help_text=u'群组锁定')
  27. group_initio = models.BooleanField(_(u'group_initio'), default=False, help_text=u'群组查看照片从头开始')
  28. class Meta:
  29. verbose_name = _(u'groupinfo')
  30. verbose_name_plural = _(u'groupinfo')
  31. def __unicode__(self):
  32. return unicode(self.group_id)
  33. @property
  34. def group_avatar_url(self):
  35. return img_url(self.group_avatar)
  36. @property
  37. def data(self):
  38. return {
  39. 'group_id': self.group_id,
  40. 'admin_id': self.admin_id,
  41. 'group_name': self.group_name,
  42. 'group_default_avatar': self.group_default_avatar,
  43. 'group_avatar': self.group_avatar_url,
  44. 'group_desc': self.group_desc,
  45. 'group_from': self.group_from,
  46. 'group_lock': self.group_lock,
  47. 'group_initio': self.group_initio,
  48. 'created_at': self.created_at.replace(microsecond=0),
  49. }
  50. def users(self, admin=True, user_id=None):
  51. all_users = GroupUserInfo.objects.filter(group_id=self.group_id, user_status__in=[GroupUserInfo.APPLYING, GroupUserInfo.PASSED])
  52. passed_users = all_users.filter(user_status=GroupUserInfo.PASSED)
  53. passed_count = passed_users.count()
  54. passed = [passed.user_info for passed in passed_users]
  55. if admin and self.admin_id != user_id:
  56. return {
  57. 'passed_count': passed_count,
  58. 'passed': passed,
  59. }
  60. applying_users = all_users.filter(user_status=GroupUserInfo.APPLYING)
  61. applying_count = applying_users.count()
  62. applying = [applying.user_info for applying in applying_users]
  63. return {
  64. 'applying_count': applying_count,
  65. 'passed_count': passed_count,
  66. 'applying': applying,
  67. 'passed': passed,
  68. }
  69. class GroupUserInfo(CreateUpdateMixin):
  70. APPLYING = 0
  71. PASSED = 1
  72. REFUSED = 2
  73. DELETED = 3
  74. QUIT = 4
  75. USER_STATUS = (
  76. (APPLYING, u'申请中'),
  77. (PASSED, u'已通过'),
  78. (REFUSED, u'已拒绝'),
  79. (DELETED, u'已删除'),
  80. (QUIT, u'已退出'),
  81. )
  82. group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
  83. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  84. current_id = models.IntegerField(_(u'current_id'), default=-1, help_text=u'当前群组照片ID')
  85. nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
  86. avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
  87. admin = models.BooleanField(_(u'admin'), default=False, help_text=u'群组管理员')
  88. user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=APPLYING)
  89. passed_at = models.DateTimeField(_(u'passed_at'), blank=True, null=True, help_text=_(u'通过时间'))
  90. refused_at = models.DateTimeField(_(u'refused_at'), blank=True, null=True, help_text=_(u'拒绝时间'))
  91. deleted_at = models.DateTimeField(_(u'deleted_at'), blank=True, null=True, help_text=_(u'删除时间'))
  92. quit_at = models.DateTimeField(_(u'quit_at'), blank=True, null=True, help_text=_(u'退出时间'))
  93. class Meta:
  94. verbose_name = _(u'groupuserinfo')
  95. verbose_name_plural = _(u'groupuserinfo')
  96. def __unicode__(self):
  97. return unicode(self.pk)
  98. @property
  99. def user_info(self):
  100. return {
  101. 'user_id': self.user_id,
  102. 'nickname': self.nickname,
  103. 'avatar': self.avatar,
  104. 'admin': self.admin,
  105. }
  106. class GroupPhotoInfo(CreateUpdateMixin):
  107. APP_GROUP = 0
  108. SESSION_GROUP = 1
  109. PHOTO_FROM = (
  110. (APP_GROUP, u'APP 建群'),
  111. (SESSION_GROUP, u'SESSION 建群'),
  112. )
  113. group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
  114. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  115. nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
  116. avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
  117. photo_path = models.CharField(_(u'photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径')
  118. photo_w = models.IntegerField(_(u'photo_w'), default=0, help_text=u'照片宽度')
  119. photo_h = models.IntegerField(_(u'photo_h'), default=0, help_text=u'照片高度')
  120. # 双列: 540, 40-50K
  121. photo_thumbnail_path = models.CharField(_(u'photo_thumbnail_path'), max_length=255, blank=True, null=True, help_text=u'照片缩略图存放路径')
  122. photo_thumbnail_w = models.IntegerField(_(u'photo_thumbnail_w'), default=0, help_text=u'照片缩略图宽度')
  123. photo_thumbnail_h = models.IntegerField(_(u'photo_thumbnail_h'), default=0, help_text=u'照片缩略图高度')
  124. # 单列: 1080, xx-100K
  125. photo_thumbnail2_path = models.CharField(_(u'photo_thumbnail2_path'), max_length=255, blank=True, null=True, help_text=u'照片缩略图存放路径')
  126. photo_thumbnail2_w = models.IntegerField(_(u'photo_thumbnail2_w'), default=0, help_text=u'照片缩略图宽度')
  127. photo_thumbnail2_h = models.IntegerField(_(u'photo_thumbnail2_h'), default=0, help_text=u'照片缩略图高度')
  128. comment_num = models.IntegerField(_(u'comment_num'), default=0, help_text=u'照片评论数量')
  129. thumbup_num = models.IntegerField(_(u'thumbup_num'), default=0, help_text=u'照片点赞数量')
  130. photo_from = models.IntegerField(_(u'photo_from'), choices=PHOTO_FROM, default=APP_GROUP, help_text=u'照片来源')
  131. session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True)
  132. lensman_id = models.CharField(_(u'lensman_id'), max_length=255, blank=True, null=True, help_text=u'摄影师唯一标识,同 PhotosInfo 表', db_index=True)
  133. lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True)
  134. class Meta:
  135. verbose_name = _(u'groupphotoinfo')
  136. verbose_name_plural = _(u'groupphotoinfo')
  137. def __unicode__(self):
  138. return unicode(self.pk)
  139. @property
  140. def photo_url(self):
  141. return img_url(self.photo_path)
  142. @property
  143. def photo_thumbnail_url(self):
  144. return img_url(self.photo_thumbnail_path)
  145. @property
  146. def photo_thumbnail2_url(self):
  147. return img_url(self.photo_thumbnail2_path)
  148. @property
  149. def photo_share_url(self):
  150. return share_url(self.pk)
  151. @property
  152. def photo_data(self):
  153. return {
  154. 'photo_id': self.pk,
  155. 'comment_num': self.comment_num,
  156. 'thumbup_num': self.thumbup_num,
  157. }
  158. def photo_info(self, user_id):
  159. try:
  160. group = GroupInfo.objects.get(group_id=self.group_id)
  161. except GroupInfo.DoesNotExist:
  162. group = None
  163. porder = get_lensman_order_record(self.pk, user_id) if self.photo_from == GroupPhotoInfo.SESSION_GROUP else {}
  164. return {
  165. 'group_id': group and group.group_id,
  166. 'group_name': group and group.group_name,
  167. 'group_default_avatar': group and group.group_default_avatar,
  168. 'group_avatar': group and group.group_avatar_url,
  169. 'group_from': group and group.group_from,
  170. 'photo_id': self.pk,
  171. 'photo_url': self.photo_url,
  172. 'photo_w': self.photo_w,
  173. 'photo_h': self.photo_h,
  174. 'photo_thumbnail_url': self.photo_thumbnail_url,
  175. 'photo_thumbnail_w': self.photo_thumbnail_w,
  176. 'photo_thumbnail_h': self.photo_thumbnail_h,
  177. 'photo_thumbnail2_url': self.photo_thumbnail2_url,
  178. 'photo_thumbnail2_w': self.photo_thumbnail2_w,
  179. 'photo_thumbnail2_h': self.photo_thumbnail2_h,
  180. 'photo_share_url': self.photo_share_url,
  181. 'user_id': self.user_id,
  182. 'nickname': self.nickname,
  183. 'avatar': self.avatar,
  184. 'comment_num': self.comment_num,
  185. 'thumbup': get_group_photo_thumbup_flag(self.pk, user_id),
  186. 'thumbup_num': self.thumbup_num,
  187. 'photo_from': self.photo_from,
  188. 'porder': porder,
  189. 'created_at': self.created_at.replace(microsecond=0),
  190. 'origin_expired_stamps': origin_expired_stamps(self.lensman_photo_id, self.user_id)
  191. }
  192. class GroupPhotoOrderInfo(CreateUpdateMixin):
  193. group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
  194. session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True)
  195. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  196. photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'照片唯一标识', db_index=True)
  197. lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True)
  198. m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,Box上传,无水印')
  199. l_photo_path = models.CharField(_(u'l_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,美化大图')
  200. r_photo_path = models.CharField(_(u'r_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,高清大图')
  201. class Meta:
  202. verbose_name = _(u'groupphotoorderinfo')
  203. verbose_name_plural = _(u'groupphotoorderinfo')
  204. def __unicode__(self):
  205. return unicode(self.pk)
  206. @property
  207. def m_photo_url(self):
  208. return img_url(self.m_photo_path)
  209. @property
  210. def l_photo_url(self):
  211. return img_url(self.l_photo_path)
  212. @property
  213. def r_photo_url(self):
  214. return img_url(self.r_photo_path)
  215. @property
  216. def porder_info(self):
  217. return {
  218. 'm_photo_url': self.m_photo_url,
  219. 'l_photo_url': self.l_photo_url,
  220. 'r_photo_url': self.r_photo_url,
  221. }
  222. class PhotoCommentInfo(CreateUpdateMixin):
  223. photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
  224. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  225. nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
  226. avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
  227. to_uid = models.CharField(_(u'to_uid'), max_length=255, blank=True, null=True, help_text=u'被评论用户唯一标识', db_index=True)
  228. comment = models.TextField(_(u'comment'), blank=True, null=True, help_text=u'用户评论')
  229. class Meta:
  230. verbose_name = _(u'photocommentinfo')
  231. verbose_name_plural = _(u'photocommentinfo')
  232. def __unicode__(self):
  233. return unicode(self.pk)
  234. @property
  235. def comment_info(self):
  236. return {
  237. 'user_id': self.user_id,
  238. 'nickname': self.nickname,
  239. 'avatar': self.avatar,
  240. 'to_uid': self.to_uid,
  241. 'comment': self.comment,
  242. 'created_at': self.created_at.replace(microsecond=0),
  243. }
  244. class PhotoThumbUpInfo(CreateUpdateMixin):
  245. photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
  246. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  247. nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
  248. avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
  249. thumbup = models.BooleanField(_(u'thumbup'), default=True, help_text=u'用户点赞', db_index=True)
  250. class Meta:
  251. verbose_name = _(u'photothumbupinfo')
  252. verbose_name_plural = _(u'photothumbupinfo')
  253. def __unicode__(self):
  254. return unicode(self.pk)
  255. @property
  256. def thumbup_info(self):
  257. return {
  258. 'user_id': self.user_id,
  259. 'nickname': self.nickname,
  260. 'avatar': self.avatar,
  261. }