Created
April 2, 2020 06:11
-
-
Save AntiKnot/48407066cc29fdea9b5b3f93f65f0903 to your computer and use it in GitHub Desktop.
会员订阅 demo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import datetime | |
| test_event = [ | |
| {"event": "try", "date": "2018 01-02 12:33:23", "amount": "3d"}, | |
| {"event": "buy", "date": "2018 04-02 12:33:23", "amount": "3m"}, | |
| {"event": "try", "date": "2018 05-02 12:33:23", "amount": "3d"}, | |
| {"event": "renew", "date": "2018 07-01 12:33:23", "amount": "1y"}, | |
| {"event": "renew", "date": "2018 10-01 12:33:23", "amount": "1m"}, | |
| {"event": "buy", "date": "2019 03-01 12:33:23", "amount": "1m"}, | |
| # {"event": "buy", "date": "2019 04-20 12:33:23", "amount": "0d"}, | |
| ] | |
| today = datetime.date.today() | |
| yesterday = datetime.date.today() - datetime.timedelta(days=1) | |
| days = {'0d': 0, '3d': 3, '1m': 30, '3m': 90, '6m': 180, '1y': 360} | |
| def string2date(string_date): | |
| return datetime.datetime.strptime(string_date, "%Y %m-%d %H:%M:%S").date() | |
| database = { | |
| 'has_try': False, | |
| 'expired_date': yesterday, | |
| 'renew_deadline': yesterday, | |
| } | |
| def wrapper(fun): | |
| def _deco(event): | |
| fun(event) | |
| print( | |
| 'premium:{} can_review:{} expired:{}'.format(is_premium(event), now_could_review(event), | |
| is_expired_now(event))) | |
| return _deco | |
| def is_premium(event): | |
| if database.get('expired_date') >= string2date(event['date']): | |
| return True | |
| return False | |
| def expired_date(): | |
| return database.get('expired_date') | |
| def is_expired(event): | |
| return True if database.get('expired_date') <= string2date(event['date']) else False | |
| def is_expired_now(event): | |
| return True if database.get('expired_date') <= today else False | |
| def renew_deadline(): | |
| return database.get('renew_deadline') | |
| def could_review(event): | |
| return True if database.get('renew_deadline') > string2date(event['date']) else False | |
| def now_could_review(event): | |
| return True if database.get('renew_deadline') > string2date(event['date']) else False | |
| @wrapper | |
| def event_try(event): | |
| if database.get('has_try'): | |
| print('this account had been tried 3d, try premium does not enjoy renew cut.') | |
| else: | |
| database.update({ | |
| 'has_try': True, | |
| 'expired_date': string2date(event['date']) + datetime.timedelta(days=3), | |
| 'renew_deadline': string2date(event['date']) + datetime.timedelta(days=3 + 15) | |
| }) | |
| print('Try success, your expired date is {}'.format(database.get('expired_date'))) | |
| @wrapper | |
| def event_buy(event): | |
| amount = event['amount'] | |
| if could_review(event) is True: | |
| print('You have bean a premium, buy will extending premium') | |
| event_renew(event) | |
| else: | |
| database.update({ | |
| 'has_try': True, | |
| 'expired_date': string2date(event['date']) + datetime.timedelta(days=days[amount]), | |
| 'renew_deadline': string2date(event['date']) + datetime.timedelta(days=days[amount] + 15) | |
| }) | |
| print('Buy success, your expired date is {}'.format(database.get('expired_date'))) | |
| @wrapper | |
| def event_renew(event): | |
| amount = event['amount'] | |
| _expired_data = database.get('expired_date') | |
| if could_review(event) is True: | |
| database.update({ | |
| 'has_try': True, | |
| 'expired_date': _expired_data + datetime.timedelta(days=days[amount]), | |
| 'renew_deadline': _expired_data + datetime.timedelta(days=days[amount] + 15), | |
| }) | |
| print('Renew success, your expired date is {}'.format(database.get('expired_date'))) | |
| else: | |
| print('This account has not bought premium, or over renew deadline, please buy premium as first') | |
| def deal_event(event): | |
| choice_fun = { | |
| 'try': event_try, | |
| 'buy': event_buy, | |
| 'renew': event_renew, | |
| } | |
| fun = choice_fun[event['event']] | |
| fun(event) | |
| if __name__ == '__main__': | |
| [deal_event(event) for event in test_event] | |
| print(database) |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
实现类似视频网站订阅会员,并且有一定订阅优惠策略。
看完fluent python 决定用策略模式重构一遍。