11import time
22import base64
33import datetime
4+ from urllib .parse import urlencode
45
56import pendulum
67import markdown
910from django .conf import settings
1011from django .utils import timezone
1112from django .db import transaction
12- from requests import PreparedRequest
13+ from django . core . cache import cache
1314from django .contrib .auth .models import AbstractUser
1415from django .core .validators import MaxValueValidator , MinValueValidator
1516
1617from apps .payments import pay
17- from apps .constants import THEME_CHOICES
18+ from apps .constants import THEME_CHOICES , NODE_USER_CACHE_KEY
1819from apps .utils import get_long_random_string , traffic_format
1920
2021
2122class User (AbstractUser ):
2223 """SS账户模型"""
2324
25+ SUB_TYPE_SS = 0
26+ SUB_TYPE_SSR = 1
27+ SUB_TYPE_ALL = 2
28+
29+ SUB_TYPES = (
30+ (SUB_TYPE_SS , "只订阅SS" ),
31+ (SUB_TYPE_SSR , "只订阅SSR" ),
32+ (SUB_TYPE_ALL , "订阅所有" ),
33+ )
34+
2435 invitecode = models .CharField (verbose_name = "邀请码" , max_length = 40 )
2536 invited_by = models .PositiveIntegerField (verbose_name = "邀请人id" , default = 1 )
2637 balance = models .DecimalField (
@@ -47,6 +58,9 @@ class User(AbstractUser):
4758 default = settings .DEFAULT_THEME ,
4859 max_length = 10 ,
4960 )
61+ sub_type = models .SmallIntegerField (
62+ verbose_name = "订阅类型" , choices = SUB_TYPES , default = SUB_TYPE_ALL
63+ )
5064
5165 class Meta (AbstractUser .Meta ):
5266 verbose_name = "用户"
@@ -102,12 +116,9 @@ def expire_time(self):
102116 @property
103117 def sub_link (self ):
104118 """生成该用户的订阅地址"""
105- p = PreparedRequest ()
106- token = base64 .b64encode (self .username .encode ()).decode ()
107- url = settings .HOST + "/server/subscribe/"
119+ token = base64 .urlsafe_b64encode (self .username .encode ()).decode ()
108120 params = {"token" : token }
109- p .prepare_url (url , params )
110- return p .url
121+ return settings .HOST + f"/server/subscribe/?{ urlencode (params )} "
111122
112123 @property
113124 def ss_user (self ):
@@ -309,6 +320,7 @@ def purchase_by_user(self, user):
309320 user .level = self .level
310321 ss_user .save ()
311322 user .save ()
323+ cache .delete (NODE_USER_CACHE_KEY )
312324 # 增加购买记录
313325 PurchaseHistory .objects .create (
314326 good = self , user = user , money = self .money , purchtime = now
@@ -448,9 +460,11 @@ def gen_out_trade_no(cls):
448460
449461 @classmethod
450462 def get_not_paid_order (cls , user , amount ):
451- return cls .objects .filter (
452- user = user , status = cls .STATUS_CREATED , amount = amount
453- ).first ()
463+ return (
464+ cls .objects .filter (user = user , status = cls .STATUS_CREATED , amount = amount )
465+ .order_by ("-created_at" )
466+ .first ()
467+ )
454468
455469 @classmethod
456470 def get_recent_created_order (cls , user ):
@@ -466,11 +480,11 @@ def make_up_lost_orders(cls):
466480
467481 @classmethod
468482 def get_or_create_order (cls , user , amount ):
483+ now = pendulum .now ()
484+ order = cls .get_not_paid_order (user , amount )
485+ if order and order .expired_at > now :
486+ return order
469487 with transaction .atomic ():
470- now = pendulum .now ()
471- order = cls .get_not_paid_order (user , amount )
472- if order and order .expired_at > now :
473- return order
474488 out_trade_no = cls .gen_out_trade_no ()
475489 trade = pay .alipay .api_alipay_trade_precreate (
476490 subject = settings .ALIPAY_TRADE_INFO .format (amount ),
0 commit comments