拍爱

models.py 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. # -*- coding: utf-8 -*-
  2. from django.db import models
  3. from django.utils.translation import ugettext_lazy as _
  4. from TimeConvert import TimeConvert as tc
  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. class GroupInfo(CreateUpdateMixin):
  11. APP_GROUP = 0
  12. SESSION_GROUP = 1
  13. TOURGUIDE_GROUP = 10
  14. GROUP_FROM = (
  15. (APP_GROUP, u'APP 建群'),
  16. (SESSION_GROUP, u'SESSION 建群'),
  17. (TOURGUIDE_GROUP, u'导游建群'),
  18. )
  19. group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True, unique=True)
  20. admin_id = models.CharField(_(u'admin_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  21. group_name = models.CharField(_(u'group_name'), max_length=255, blank=True, null=True, help_text=u'群组名称')
  22. group_default_avatar = models.IntegerField(_(u'group_default_avatar'), default=0, help_text=u'群组默认头像,0 - 255,水果头像')
  23. group_avatar = models.CharField(_(u'group_avatar'), max_length=255, blank=True, null=True, help_text=u'群组头像')
  24. group_desc = models.TextField(_(u'group_desc'), blank=True, null=True, help_text=u'群组描述')
  25. group_from = models.IntegerField(_(u'group_from'), choices=GROUP_FROM, default=APP_GROUP, help_text=u'群组来源')
  26. session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识', db_index=True)
  27. group_lock = models.BooleanField(_(u'group_lock'), default=False, help_text=u'群组锁定')
  28. group_initio = models.BooleanField(_(u'group_initio'), default=False, help_text=u'群组查看照片从头开始')
  29. # 旅行团
  30. name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'导游姓名')
  31. phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'导游电话')
  32. started_at = models.DateTimeField(_(u'started_at'), blank=True, null=True, help_text=_(u'旅游团开始时间'))
  33. ended_at = models.DateTimeField(_(u'ended_at'), blank=True, null=True, help_text=_(u'旅游团结束时间'))
  34. total_persons = models.IntegerField(_(u'total_persons'), default=1, help_text=u'旅游团总人数')
  35. group_closed = models.BooleanField(_(u'group_closed'), default=False, help_text=u'旅游团关闭')
  36. gather_at = models.DateTimeField(_(u'gather_at'), blank=True, null=True, help_text=_(u'旅游团集合时间'))
  37. gather_lon = models.FloatField(_(u'gather_lon'), blank=True, null=True, help_text=_(u'旅游团集合经度'))
  38. gather_lat = models.FloatField(_(u'gather_lat'), blank=True, null=True, help_text=_(u'旅游团集合纬度'))
  39. gather_location = models.CharField(_(u'gather_location'), max_length=255, blank=True, null=True, help_text=u'旅游团集合地点')
  40. attentions_path = models.CharField(_(u'attentions_path'), max_length=255, blank=True, null=True, help_text=u'注意事项照片存放路径')
  41. schedules_path = models.CharField(_(u'schedules_path'), max_length=255, blank=True, null=True, help_text=u'行程安排照片存放路径')
  42. class Meta:
  43. verbose_name = _(u'groupinfo')
  44. verbose_name_plural = _(u'groupinfo')
  45. def __unicode__(self):
  46. return unicode(self.group_id)
  47. @property
  48. def group_avatar_url(self):
  49. return img_url(self.group_avatar)
  50. @property
  51. def group_attentions_url(self):
  52. return img_url(self.attentions_path)
  53. @property
  54. def group_schedules_url(self):
  55. return img_url(self.schedules_path)
  56. @property
  57. def data(self):
  58. return {
  59. 'group_id': self.group_id,
  60. 'admin_id': self.admin_id,
  61. 'group_name': self.group_name,
  62. 'group_default_avatar': self.group_default_avatar,
  63. 'group_avatar': self.group_avatar_url,
  64. 'group_desc': self.group_desc,
  65. 'group_from': self.group_from,
  66. 'group_lock': self.group_lock,
  67. 'group_initio': self.group_initio,
  68. 'name': self.name,
  69. 'phone': self.phone,
  70. 'started_at': tc.remove_microsecond(self.started_at),
  71. 'ended_at': tc.remove_microsecond(self.ended_at),
  72. 'total_persons': self.total_persons,
  73. 'gather_at': tc.remove_microsecond(self.gather_at),
  74. 'gather_lon': self.gather_lon,
  75. 'gather_lat': self.gather_lat,
  76. 'gather_location': self.gather_location,
  77. 'created_at': tc.remove_microsecond(self.created_at),
  78. 'banners': {
  79. 'attentions': self.group_attentions_url,
  80. 'schedules': self.group_schedules_url,
  81. },
  82. }
  83. def users(self, admin=True, user_id=None):
  84. all_users = GroupUserInfo.objects.filter(group_id=self.group_id, user_status__in=[GroupUserInfo.APPLYING, GroupUserInfo.PASSED])
  85. passed_users = all_users.filter(user_status=GroupUserInfo.PASSED)
  86. passed_count = passed_users.count()
  87. passed = [passed.user_info for passed in passed_users]
  88. if admin and self.admin_id != user_id:
  89. return {
  90. 'passed_count': passed_count,
  91. 'passed': passed,
  92. }
  93. applying_users = all_users.filter(user_status=GroupUserInfo.APPLYING)
  94. applying_count = applying_users.count()
  95. applying = [applying.user_info for applying in applying_users]
  96. return {
  97. 'applying_count': applying_count,
  98. 'passed_count': passed_count,
  99. 'applying': applying,
  100. 'passed': passed,
  101. }
  102. class GroupUserInfo(CreateUpdateMixin):
  103. APPLYING = 0
  104. PASSED = 1
  105. REFUSED = 2
  106. DELETED = 3
  107. QUIT = 4
  108. USER_STATUS = (
  109. (APPLYING, u'申请中'),
  110. (PASSED, u'已通过'),
  111. (REFUSED, u'已拒绝'),
  112. (DELETED, u'已删除'),
  113. (QUIT, u'已退出'),
  114. )
  115. group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
  116. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  117. current_id = models.IntegerField(_(u'current_id'), default=-1, help_text=u'当前群组照片ID')
  118. nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
  119. avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
  120. admin = models.BooleanField(_(u'admin'), default=False, help_text=u'群组管理员')
  121. user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=APPLYING)
  122. passed_at = models.DateTimeField(_(u'passed_at'), blank=True, null=True, help_text=_(u'通过时间'))
  123. refused_at = models.DateTimeField(_(u'refused_at'), blank=True, null=True, help_text=_(u'拒绝时间'))
  124. deleted_at = models.DateTimeField(_(u'deleted_at'), blank=True, null=True, help_text=_(u'删除时间'))
  125. quit_at = models.DateTimeField(_(u'quit_at'), blank=True, null=True, help_text=_(u'退出时间'))
  126. # 旅行团相关
  127. subadmin = models.BooleanField(_(u'subadmin'), default=False, help_text=u'副群组管理员')
  128. name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名')
  129. phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'用户电话')
  130. relative_persons = models.IntegerField(_(u'relative_persons'), default=1, help_text=u'关联人数')
  131. authority = models.BooleanField(_(u'authority'), default=True, help_text=u'是否有定位权限')
  132. remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注')
  133. class Meta:
  134. verbose_name = _(u'groupuserinfo')
  135. verbose_name_plural = _(u'groupuserinfo')
  136. unique_together = (('group_id', 'user_id'),)
  137. def __unicode__(self):
  138. return unicode(self.pk)
  139. @property
  140. def user_info(self):
  141. return {
  142. 'user_id': self.user_id,
  143. 'nickname': self.nickname,
  144. 'avatar': self.avatar,
  145. 'admin': self.admin,
  146. 'subadmin': self.subadmin,
  147. 'name': self.name,
  148. 'phone': self.phone,
  149. 'relative_persons': self.relative_persons,
  150. 'authority': self.authority,
  151. 'remark': self.remark,
  152. }
  153. class GroupPhotoInfo(CreateUpdateMixin):
  154. APP_GROUP = 0
  155. SESSION_GROUP = 1
  156. PHOTO_FROM = (
  157. (APP_GROUP, u'APP 建群'),
  158. (SESSION_GROUP, u'SESSION 建群'),
  159. )
  160. group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
  161. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  162. nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
  163. avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
  164. photo_path = models.CharField(_(u'photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径')
  165. photo_w = models.IntegerField(_(u'photo_w'), default=0, help_text=u'照片宽度')
  166. photo_h = models.IntegerField(_(u'photo_h'), default=0, help_text=u'照片高度')
  167. # 双列: 540, 40-50K
  168. photo_thumbnail_path = models.CharField(_(u'photo_thumbnail_path'), max_length=255, blank=True, null=True, help_text=u'照片缩略图存放路径')
  169. photo_thumbnail_w = models.IntegerField(_(u'photo_thumbnail_w'), default=0, help_text=u'照片缩略图宽度')
  170. photo_thumbnail_h = models.IntegerField(_(u'photo_thumbnail_h'), default=0, help_text=u'照片缩略图高度')
  171. # 单列: 1080, xx-100K
  172. photo_thumbnail2_path = models.CharField(_(u'photo_thumbnail2_path'), max_length=255, blank=True, null=True, help_text=u'照片缩略图存放路径')
  173. photo_thumbnail2_w = models.IntegerField(_(u'photo_thumbnail2_w'), default=0, help_text=u'照片缩略图宽度')
  174. photo_thumbnail2_h = models.IntegerField(_(u'photo_thumbnail2_h'), default=0, help_text=u'照片缩略图高度')
  175. comment_num = models.IntegerField(_(u'comment_num'), default=0, help_text=u'照片评论数量')
  176. thumbup_num = models.IntegerField(_(u'thumbup_num'), default=0, help_text=u'照片点赞数量')
  177. photo_from = models.IntegerField(_(u'photo_from'), choices=PHOTO_FROM, default=APP_GROUP, help_text=u'照片来源')
  178. session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True)
  179. lensman_id = models.CharField(_(u'lensman_id'), max_length=255, blank=True, null=True, help_text=u'摄影师唯一标识,同 PhotosInfo 表', db_index=True)
  180. lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True)
  181. class Meta:
  182. verbose_name = _(u'groupphotoinfo')
  183. verbose_name_plural = _(u'groupphotoinfo')
  184. def __unicode__(self):
  185. return unicode(self.pk)
  186. @property
  187. def photo_url(self):
  188. return img_url(self.photo_path)
  189. @property
  190. def photo_thumbnail_url(self):
  191. return img_url(self.photo_thumbnail_path)
  192. @property
  193. def photo_thumbnail2_url(self):
  194. return img_url(self.photo_thumbnail2_path)
  195. @property
  196. def photo_share_url(self):
  197. return share_url(self.pk)
  198. @property
  199. def photo_data(self):
  200. return {
  201. 'photo_id': self.pk,
  202. 'comment_num': self.comment_num,
  203. 'thumbup_num': self.thumbup_num,
  204. }
  205. def photo_info(self, user_id):
  206. try:
  207. group = GroupInfo.objects.get(group_id=self.group_id)
  208. except GroupInfo.DoesNotExist:
  209. group = None
  210. porder = get_lensman_order_record(self.pk, user_id) if self.photo_from == GroupPhotoInfo.SESSION_GROUP else {}
  211. return {
  212. 'group_id': group and group.group_id,
  213. 'group_name': group and group.group_name,
  214. 'group_default_avatar': group and group.group_default_avatar,
  215. 'group_avatar': group and group.group_avatar_url,
  216. 'group_from': group and group.group_from,
  217. 'photo_id': self.pk,
  218. 'photo_url': self.photo_url,
  219. 'photo_w': self.photo_w,
  220. 'photo_h': self.photo_h,
  221. 'photo_thumbnail_url': self.photo_thumbnail_url,
  222. 'photo_thumbnail_w': self.photo_thumbnail_w,
  223. 'photo_thumbnail_h': self.photo_thumbnail_h,
  224. 'photo_thumbnail2_url': self.photo_thumbnail2_url,
  225. 'photo_thumbnail2_w': self.photo_thumbnail2_w,
  226. 'photo_thumbnail2_h': self.photo_thumbnail2_h,
  227. 'photo_share_url': self.photo_share_url,
  228. 'user_id': self.user_id,
  229. 'nickname': self.nickname,
  230. 'avatar': self.avatar,
  231. 'comment_num': self.comment_num,
  232. 'thumbup': get_group_photo_thumbup_flag(self.pk, user_id),
  233. 'thumbup_num': self.thumbup_num,
  234. 'photo_from': self.photo_from,
  235. 'session_id': self.session_id,
  236. 'porder': porder,
  237. 'created_at': self.created_at.replace(microsecond=0),
  238. 'origin_expired_stamps': origin_expired_stamps(self.lensman_photo_id, self.user_id)
  239. }
  240. class GroupPhotoOrderInfo(CreateUpdateMixin):
  241. group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
  242. session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True)
  243. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  244. photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'照片唯一标识', db_index=True)
  245. lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True)
  246. m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,Box上传,无水印')
  247. l_photo_path = models.CharField(_(u'l_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,美化大图')
  248. r_photo_path = models.CharField(_(u'r_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,高清大图')
  249. class Meta:
  250. verbose_name = _(u'groupphotoorderinfo')
  251. verbose_name_plural = _(u'groupphotoorderinfo')
  252. def __unicode__(self):
  253. return unicode(self.pk)
  254. @property
  255. def m_photo_url(self):
  256. return img_url(self.m_photo_path)
  257. @property
  258. def l_photo_url(self):
  259. return img_url(self.l_photo_path)
  260. @property
  261. def r_photo_url(self):
  262. return img_url(self.r_photo_path)
  263. @property
  264. def porder_info(self):
  265. return {
  266. 'm_photo_url': self.m_photo_url,
  267. 'l_photo_url': self.l_photo_url,
  268. 'r_photo_url': self.r_photo_url,
  269. }
  270. class PhotoCommentInfo(CreateUpdateMixin):
  271. photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
  272. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  273. nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
  274. avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
  275. to_uid = models.CharField(_(u'to_uid'), max_length=255, blank=True, null=True, help_text=u'被评论用户唯一标识', db_index=True)
  276. comment = models.TextField(_(u'comment'), blank=True, null=True, help_text=u'用户评论')
  277. class Meta:
  278. verbose_name = _(u'photocommentinfo')
  279. verbose_name_plural = _(u'photocommentinfo')
  280. def __unicode__(self):
  281. return unicode(self.pk)
  282. @property
  283. def comment_info(self):
  284. return {
  285. 'user_id': self.user_id,
  286. 'nickname': self.nickname,
  287. 'avatar': self.avatar,
  288. 'to_uid': self.to_uid,
  289. 'comment': self.comment,
  290. 'created_at': tc.remove_microsecond(self.created_at),
  291. }
  292. class PhotoThumbUpInfo(CreateUpdateMixin):
  293. photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
  294. user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
  295. nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
  296. avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
  297. thumbup = models.BooleanField(_(u'thumbup'), default=True, help_text=u'用户点赞', db_index=True)
  298. class Meta:
  299. verbose_name = _(u'photothumbupinfo')
  300. verbose_name_plural = _(u'photothumbupinfo')
  301. def __unicode__(self):
  302. return unicode(self.pk)
  303. @property
  304. def thumbup_info(self):
  305. return {
  306. 'user_id': self.user_id,
  307. 'nickname': self.nickname,
  308. 'avatar': self.avatar,
  309. }