d4733d0e5bL115">115 145
     city = models.CharField(_(u'city'), max_length=255, blank=True, null=True, help_text=u'用户城市')
116 146
     location = models.CharField(_(u'location'), max_length=255, blank=True, null=True, help_text=u'用户地址')
117 147
 
148
+    balance = models.IntegerField(_(u'balance'), default=0, help_text=u'用户余额(分)')
149
+
118 150
     user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED)
119 151
 
120 152
     assign_ip = models.CharField(_(u'assign_ip'), max_length=255, blank=True, null=True, help_text=_(u'分配IP'))
@@ -170,3 +202,29 @@ class UserLoginLogInfo(CreateUpdateMixin):
170 202
 
171 203
     def __unicode__(self):
172 204
         return unicode(self.pk)
205
+
206
+
207
+class UserIncomeExpensesInfo(CreateUpdateMixin):
208
+    INCOME = 0
209
+    EXPENSE = 1
210
+
211
+    TYPE = (
212
+        (INCOME, u'收入'),
213
+        (EXPENSE, u'支出'),
214
+    )
215
+
216
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
217
+    photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'照片唯一标识', db_index=True)
218
+
219
+    type = models.IntegerField(_(u'type'), choices=TYPE, default=INCOME, help_text=u'收支类别')
220
+    amount = models.IntegerField(_(u'amount'), default=0, help_text=u'余额增减数量(分)')
221
+    balance = models.IntegerField(_(u'balance'), default=0, help_text=u'余额增减后数量(分)')
222
+
223
+    remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注')
224
+
225
+    class Meta:
226
+        verbose_name = _(u'userincomeexpensesinfo')
227
+        verbose_name_plural = _(u'userincomeexpensesinfo')
228
+
229
+    def __unicode__(self):
230
+        return unicode(self.pk)

+ 14 - 0
account/views.py

@@ -1,6 +1,7 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3 3
 from curtail_uuid import CurtailUUID
4
+from django.conf import settings
4 5
 from django.contrib.auth.hashers import check_password, make_password
5 6
 from django.contrib.auth.models import Group, User
6 7
 from django.http import JsonResponse
@@ -207,6 +208,19 @@ def wx_authorize_api(request):
207 208
     })
208 209
 
209 210
 
211
+def guest_login_api(request):
212
+    try:
213
+        user = UserInfo.objects.get(user_id=settings.GUEST_USER_ID)
214
+    except UserInfo.DoesNotExist:
215
+        return response(UserStatusCode.GUEST_NOT_FOUND)
216
+
217
+    return JsonResponse({
218
+        'status': 200,
219
+        'message': u'Guest 登录成功',
220
+        'data': user.data,
221
+    })
222
+
223
+
210 224
 class UserViewSet(viewsets.ModelViewSet):
211 225
     """
212 226
     API endpoint that allows users to be viewed or edited.

+ 2 - 0
api/urls.py

@@ -18,6 +18,8 @@ urlpatterns = [
18 18
     url(r'^u/login$', account_views.user_login_api, name='user_login_api'),  # 用户登录
19 19
 
20 20
     url(r'^u/wx/authorize$', account_views.wx_authorize_api, name='wx_authorize_api'),  # 微信用户授权
21
+
22
+    url(r'^u/guest$', account_views.guest_login_api, name='guest_login_api'),  # 游客登录
21 23
 ]
22 24
 
23 25
 # 群组相关

+ 4 - 0
pai2/settings.py

@@ -225,6 +225,7 @@ WECHAT_GET_OAUTH2_ACCESS_TOKEN = 'https://api.weixin.qq.com/sns/oauth2/access_to
225 225
 
226 226
 WECHAT_GET_USERINFO = 'https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s'
227 227
 
228
+# 微信支付设置
228 229
 WXPAY_NOTIFY_SUCCESS = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>'
229 230
 WXPAY_NOTIFY_FAIL = '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[XML PARSE FAIL]]></return_msg></xml>'
230 231
 
@@ -250,6 +251,9 @@ PAI2_HOME_MAX_ROWS = 400  # 首页照片最大数量, PAI2_HOME_PER_PAGE * PAI2_
250 251
 # 群组设置
251 252
 GROUP_PER_PAGE = 20  # 群组每页数量
252 253
 
254
+# 游客设置
255
+GUEST_USER_ID = 'guest'
256
+
253 257
 # 价格设置
254 258
 LENSMAN_PHOTO_HAGGLE_MAX_TIMES = 3  # 摄影师照片最大砍价次数
255 259
 

+ 2 - 0
utils/error/errno_utils.py

@@ -26,6 +26,8 @@ class UserStatusCode(BaseStatusCode):
26 26
     USER_PASSWORD_ERROR = StatusCodeField(400102, u'User Password Error', description=u'用户密码错误')
27 27
     USERNAME_HAS_REGISTERED = StatusCodeField(400103, u'Username Has Registered', description=u'用户名已注册')
28 28
 
29
+    GUEST_NOT_FOUND = StatusCodeField(400111, u'Guest Not Found', description=u'游客不存在')
30
+
29 31
 
30 32
 class PhotoStatusCode(BaseStatusCode):
31 33
     """ 照片相关错误码 4010xx """

pai2 - Gogs: Go Git Service

拍爱

admin.py 3.7KB

    # -*- coding: utf-8 -*- from django.conf import settings from django.contrib import admin from django.template.loader import render_to_string from operation.models import APPSettingsInfo, FeedbackInfo, GuestEntranceControlInfo, LatestAppInfo, SplashInfo from utils.disk_utils import write_to_disk from utils.redis.rapp import set_latest_app from utils.redis.rguest import delete_guest_entrance_control, set_guest_entrance_control from utils.redis.rsettings import del_app_settings_info, set_app_settings_info from utils.strip_utils import tstrip class LatestAppInfoAdmin(admin.ModelAdmin): list_display = ('latest_adr_version_code', 'latest_adr_version_name', 'latest_adr_app', 'latest_adr_url', 'latest_ios_version_code', 'latest_ios_version_name', 'latest_ios_url', 'src', 'status', 'created_at', 'updated_at') list_filter = ('src', 'status') def save_model(self, request, obj, form, change): obj.latest_adr_version_code = tstrip(obj.latest_adr_version_code) obj.latest_adr_version_name = tstrip(obj.latest_adr_version_name) obj.latest_adr_app = tstrip(obj.latest_adr_app) obj.latest_ios_version_code = tstrip(obj.latest_ios_version_code) obj.latest_ios_version_name = tstrip(obj.latest_ios_version_name) obj.latest_ios_url = tstrip(obj.latest_ios_url) obj.save() if obj.src == LatestAppInfo.PAIAI_USER: # 更新安卓下载页面 write_to_disk(render_to_string('page/download.tmpl.html', { 'version': obj.latest_adr_version_name, }), settings.DOWNLOAD_ADR_PAGE_PATH) # 更新 iOS 下载页面 write_to_disk(render_to_string('page/download.tmpl.html', { 'version': obj.latest_ios_version_name, }), settings.DOWNLOAD_IOS_PAGE_PATH) # 设置最新 APP 信息 set_latest_app(obj.src) class APPSettingsInfoAdmin(admin.ModelAdmin): list_display = ('platform', 'channel', 'version', 'online', 'status', 'created_at', 'updated_at') list_filter = ('platform', 'online', 'status') def save_model(self, request, obj, form, change): obj.channel = tstrip(obj.channel) obj.version = tstrip(obj.version) obj.save() # 设置 APP 设置信息 set_app_settings_info(obj) def delete_model(self, request, obj): obj.delete() # 删除 APP 设置信息 del_app_settings_info(obj) class SplashInfoAdmin(admin.ModelAdmin): list_display = ('splash_image', 'spalash_image_airtime', 'spalash_image_deadline', 'src', 'status', 'created_at', 'updated_at') list_filter = ('src', 'status') class FeedbackInfoAdmin(admin.ModelAdmin): list_display = ('user_id', 'feedback', 'src', 'status', 'created_at', 'updated_at') list_filter = ('src', 'status') class GuestEntranceControlInfoAdmin(admin.ModelAdmin): list_display = ('platform', 'min_adr', 'max_adr', 'min_ios', 'max_ios', 'status', 'created_at', 'updated_at') def save_model(self, request, obj, form, change): obj.min_adr = tstrip(obj.min_adr) obj.max_adr = tstrip(obj.max_adr) obj.min_ios = tstrip(obj.min_ios) obj.max_ios = tstrip(obj.max_ios) obj.save() # 设置游客入口控制 set_guest_entrance_control(obj) def delete_model(self, request, obj): obj.delete() # 删除游客入口控制 delete_guest_entrance_control() admin.site.register(LatestAppInfo, LatestAppInfoAdmin) admin.site.register(APPSettingsInfo, APPSettingsInfoAdmin) admin.site.register(SplashInfo, SplashInfoAdmin) admin.site.register(FeedbackInfo, FeedbackInfoAdmin) admin.site.register(GuestEntranceControlInfo, GuestEntranceControlInfoAdmin)