浏览代码

Merge branch 'bin' of http://192.168.136.99:3000/SERVER/AnsjerServer into bin

 Conflicts:
	Controller/EquipmentManager.py
	Controller/EquipmentManagerV3.py
	Model/models.py
	Service/ModelService.py
chenshibin 4 年之前
父节点
当前提交
cbb969ddcf

+ 1 - 0
Ansjer/config.py

@@ -32,6 +32,7 @@ SES_COMPANY_EMAIL = 'user_server@nsst.com'
 AWS_SES_ACCESS_ID = 'AKIAJKPU23EU5QWHFPKQ'
 AWS_SES_ACCESS_SECRET = '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'
 AWS_SES_ACCESS_REGION = 'us-east-1'
+AWS_SES_ACCESS_REGION_WEST = 'us-west-1'
 AWS_BUCKET = 'ansjertest'
 # 设定离线时间为5分钟
 OFF_LINE_TIME_DELTA = 5

+ 5 - 0
Ansjer/config_test.py

@@ -33,6 +33,11 @@ PAYPAL_CRD = {
     "client_id": "AVLoQVq3xHZ6FrF4mxHwlCPgVBAw4Fw5RtMkuxmYd23SkUTIY643n2g3KdK-Al8wV05I28lza5uoQbAA",
     "client_secret": "EO8kRc8yioDk0i2Qq-QMcVFfwkmyMJorTvBSLDTnxDJJ_wb9VoM_0jkUY9iEng2Flp1ze8wQOGpH5nB2"
 }
+# PAYPAL_CRD = {
+#     "mode": "sandbox",  # sandbox or live
+#     "client_id": "ATXTpWs8sajNYeU46jNs1yzpy4H_o3RRrGVIJ8Tscc312BjMx12cpRgCucfWX07a4G6GbK8hzElB04Pd",
+#     "client_secret": "EHcnfrpL1o1ev9WnlQ-C1uymeRKDoJ6li6Y0d6iHoRGj4u8Sx5lSEEH774XphP4LQZ0DrDUdvxbux0T2"
+# }
 DETECT_PUSH_DOMAIN = 'http://test.push.dvema.com/'
 # 数据库dyanamo品牌日志数据库
 USER_BRAND = 'test_user_brand'

+ 27 - 0
Ansjer/formal_statistics_push_day_task.py

@@ -0,0 +1,27 @@
+import json
+
+import requests
+
+
+base_url = 'http://dvema.com'
+username='13800138001'
+password='ansjer123456'
+
+login_url = base_url + 'account/login'
+
+data = {
+    'userName': username,
+    'userPwd': password
+}
+res = requests.post(url=login_url, data=data)
+res = res.json()
+print(res)
+
+if res['result_code'] == 0:
+    statistics_url = base_url + 'statistcs/pushDay'
+    data = {
+        'token': res['result']['access_token']
+    }
+    res = requests.post(url=statistics_url, data=data)
+    print(res.json())
+

+ 27 - 0
Ansjer/formal_statistics_push_month_task.py

@@ -0,0 +1,27 @@
+import json
+
+import requests
+
+
+# url = 'http://test.dvema.com'
+base_url = 'http://dvema.com/'
+username='13800138001'
+password='ansjer123456'
+login_url = base_url + 'account/login'
+
+data = {
+    'userName': username,
+    'userPwd': password
+}
+res = requests.post(url=login_url, data=data)
+res = res.json()
+print(res)
+
+if res['result_code'] == 0:
+    statistics_url = base_url + 'statistcs/pushMonth'
+    data = {
+        'token': res['result']['access_token']
+    }
+    res = requests.post(url=statistics_url, data=data)
+    print(res.json())
+

+ 27 - 0
Ansjer/test_statistics_push_day_task.py

@@ -0,0 +1,27 @@
+import json
+
+import requests
+
+
+# url = 'http://test.dvema.com'
+base_url = 'http://test.dvema.com/'
+username='13800138001'
+password='ansjer999999'
+login_url = base_url + 'account/login'
+
+data = {
+    'userName': username,
+    'userPwd': password
+}
+res = requests.post(url=login_url, data=data)
+res = res.json()
+print(res)
+
+if res['result_code'] == 0:
+    statistics_url = base_url + 'statistcs/pushDay'
+    data = {
+        'token': res['result']['access_token']
+    }
+    res = requests.post(url=statistics_url, data=data)
+    print(res.json())
+

+ 27 - 0
Ansjer/test_statistics_push_month_task.py

@@ -0,0 +1,27 @@
+import json
+
+import requests
+
+
+# url = 'http://test.dvema.com'
+base_url = 'http://test.dvema.com/'
+username='13800138001'
+password='ansjer999999'
+login_url = base_url + 'account/login'
+
+data = {
+    'userName': username,
+    'userPwd': password
+}
+res = requests.post(url=login_url, data=data)
+res = res.json()
+print(res)
+
+if res['result_code'] == 0:
+    statistics_url = base_url + 'statistcs/pushMonth'
+    data = {
+        'token': res['result']['access_token']
+    }
+    res = requests.post(url=statistics_url, data=data)
+    print(res.json())
+

+ 2 - 0
Ansjer/urls.py

@@ -218,6 +218,8 @@ urlpatterns = [
     url(r'^v2/userbrand/(?P<operation>.*)$', UserBrandControllerV2.UserBrandV2.as_view()),
     url(r'^statistcs/appFrequencyMonth$', StatisticsController.statistcsAppFrequency),
     url(r'^statistcs/appFrequencyYear$', StatisticsController.statistcsAppFrequencyYear),
+    url(r'^statistcs/pushDay$', StatisticsController.statistcsPushDay),
+    url(r'^statistcs/pushMonth$', StatisticsController.statistcsPushMonth),
 
     #统计alexa连接数
     url(r'^alexa/(?P<operation>.*)$', Alexa.AlexaConnectNum.as_view()),

+ 2 - 0
Controller/AccessLog.py

@@ -19,6 +19,8 @@ http://192.168.136.40:8077/accesslog?operation=queryByAdmin&token=test&page=1&li
 http://192.168.136.40:8077/accesslog?operation=truncateByAdmin&token=test
 http://192.168.136.40:8077/accesslog?operation=searchByAdmin&token=test&page=1&line=10&content={"status":20}&order=-id
 
+
+
 http://192.168.136.40:8077/accesslog/staticPath/?token=stest
 '''
 

+ 204 - 2
Controller/AdminManage.py

@@ -1,20 +1,23 @@
 # -*- coding: utf-8 -*-
 import time
+from datetime import date, timedelta, timezone as asj_timezone
 
+import boto3
 from django.db.models import Count,Q
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic import TemplateView
 from django.utils.decorators import method_decorator
 from django.contrib.auth.hashers import make_password  # 对密码加密模块
 from Model.models import Device_Info, Role, UserExModel, User_Brand, UidSetModel, AppFrequencyYearStatisticsModel, \
-    AppFrequencyStatisticsModel
+    AppFrequencyStatisticsModel, EquipmentInfoExStatisticsModel, Equipment_Info
 from Service.ModelService import ModelService
 from django.utils import timezone
 from Model.models import Access_Log, Device_User
 from django.views.decorators.http import require_http_methods
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
-from Ansjer.config import OFF_LINE_TIME_DELTA, DEVICE_TYPE
+from Ansjer.config import OFF_LINE_TIME_DELTA, DEVICE_TYPE, AWS_SES_ACCESS_ID, AWS_SES_ACCESS_SECRET, \
+    AWS_SES_ACCESS_REGION_WEST
 import datetime, simplejson as json
 from Service.CommonService import CommonService
 from Object.RedisObject import RedisObject
@@ -78,6 +81,12 @@ class AdminManage(TemplateView):
             return self.getAppFrequency(userID, request_dict, response)
         if operation == 'getHistoryAppFrequency':
             return self.getAllAppFrequency(userID, response)
+        if operation == 'getPushStatistics':
+            return self.query_push_by_level(userID, request_dict, response)
+        if operation == 'getPushFailures':
+            return self.query_failures_push(userID, request_dict, response)
+        if operation == 'getPushServerCPUUsage':
+            return self.query_push_server_cpu_usage(userID, request_dict, response)
 
     def resetUserPwd(self, request_dict, userID, response):
         own_permission = ModelService.check_perm(userID=userID, permID=50)
@@ -434,6 +443,199 @@ class AdminManage(TemplateView):
         else:
             return response.json(0, [])
 
+    def query_push_by_level(self, userID, request_dict, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+
+        level = request_dict.get('level', None)
+        print(level)
+        if level is None:
+            return response.json(444)
+
+        level = int(level)
+        if level < 0:
+            return response.json(444)
+        elif level < 3:
+            return self.query_push_day_statistics(level, response)
+        else:
+            return response.json(404)
+
+    def query_push_day_statistics(self, level, response):
+        start_time = 0
+
+        gmtime = time.gmtime(int(time.time()) + 28800)
+        current_day = gmtime.tm_mday
+        time_struct = [gmtime.tm_year, gmtime.tm_mon, current_day, 0, 0, 0, 0, 0, 0]
+        current_time = int(time.mktime(tuple(time_struct))) - 28800
+
+        count = 0
+        if level == 0: # 七天
+            start_time = current_time - 6 * 24 * 3600
+            count = 6
+        elif level == 1:
+            start_time = current_time - 13 * 24 * 3600
+            count = 13
+        elif level == 2:
+            start_time = current_time - 29 * 24 * 3600
+            count = 29
+
+        end_time = current_time
+
+        eqx_qs = EquipmentInfoExStatisticsModel.objects.filter(statistics_date__gte=start_time, statistics_date__lte=end_time, date_type=0, push_type=-1).values()
+        data = []
+
+        for i in range(count + 1):
+            data.append({
+                'date_time': int(start_time),
+                'data': None
+            })
+            start_time += (24 * 60 * 60)
+
+        tmp_dict = {}
+        successes = 0
+        failures = 0
+        for eqx in eqx_qs:
+            successes += eqx['number_of_successes']
+            failures += eqx['number_of_failures']
+            tmp_dict[eqx['statistics_date']] = {
+                'number_of_successes': eqx['number_of_successes'],
+                'number_of_failures': eqx['number_of_failures'],
+                'total': (eqx['number_of_successes'] + eqx['number_of_failures'])
+            }
+
+        # 取出当前的推送数据
+        start_time = current_time
+        current_time = int(time.time())
+        eq_qs = Equipment_Info.objects.filter(addTime__gte=start_time, addTime__lte=current_time)
+        print(eq_qs.values())
+        # 0:APNS推送,1:谷歌推送,2:极光推送
+        tmp = {
+            'number_of_successes': 0,
+            'number_of_failures': 0,
+            'total': 0
+        }
+        for eq in eq_qs:
+            if eq.push_server_status == 200:
+                tmp['number_of_successes'] += 1
+                successes += 1
+            else:
+                tmp['number_of_failures'] += 1
+                failures += 1
+            tmp['total'] += 1
+
+        tmp_dict[current_time] = tmp
+
+        for item in data:
+            if tmp_dict.__contains__(item['date_time']):
+                item['data'] = tmp_dict[item['date_time']]
+
+        success_rate = round(successes / (successes + failures), 2)
+        arrival_rate = success_rate
+
+        res = {
+            'data': data,
+            'successes': successes,
+            'failures': failures,
+            'success_rate': success_rate,
+            'arrival_rate': arrival_rate
+        }
+
+        return response.json(0, res)
+
+    # def query_push_month_statistics(self, level, response):
+    #     start_time = 0
+    #     end_time = 0
+    #     localtime = time.localtime()
+    #     current_month = localtime.tm_mon
+    #
+    #     time_struct = [localtime.tm_year, current_month, 1, 0, 0, 0, 0, 0, 0]
+    #     current_time = int(time.mktime(tuple(time_struct)))
+    #     current_time = current_time - time.timezone - 8 * 60 * 60
+    #     count = 0
+    #     start_month = 0
+    #     if level == 3:  # 6个月
+    #         start_month = current_month - 5
+    #         count = 5
+    #     elif level == 4:
+    #         start_month = current_month - 11
+    #         count = 10
+    #
+    #
+    #     return
+
+    def query_failures_push(self, userID, request_dict, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+
+        start_time = request_dict.get('start_time', None)
+        end_time = request_dict.get('end_time', None)
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+
+        if not start_time or not end_time or not page or not line:
+            return response.json(444)
+
+        start_time = int(start_time)
+        end_time = int(end_time)
+        page = int(page)
+        line = int(line)
+        if page <= 0 or line < 0:
+            return response.json(444, 'page, line')
+
+        eq_qs = Equipment_Info.objects.filter(addTime__gte=start_time, addTime__lte=end_time)\
+            .filter(~Q(push_server_status=200)).values('id', 'devUid', 'devNickName', 'Channel', 'alarm', 'eventType', 'eventTime', 'receiveTime', 'push_server_status', 'userID__username')
+        if eq_qs.exists():
+            count = eq_qs.count()
+            eq_qs = eq_qs[(page-1)*line: page * line]
+            return response.json(0, {'count': count, 'data': list(eq_qs)})
+        else:
+            return response.json(0, {'count': 0, 'data': []})
+
+    def query_push_server_cpu_usage(self, userID, request_dict, response):
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+
+        start_time = request_dict.get('start_time', None)
+        end_time = request_dict.get('end_time', None)
+        tz = request_dict.get('tz', None)
+
+        if start_time is None or end_time is None or tz is None:
+            return response.json(444)
+
+        date = datetime.datetime(2020, 9, 15)
+        start_time = date.fromtimestamp((int(start_time)))
+        end_time = date.fromtimestamp(int(end_time))
+        tz = int(tz)
+
+        cloudwatch = boto3.client('cloudwatch', region_name=AWS_SES_ACCESS_REGION_WEST, aws_access_key_id=AWS_SES_ACCESS_ID,
+                                  aws_secret_access_key=AWS_SES_ACCESS_SECRET)
+        try:
+            result = cloudwatch.get_metric_statistics(Namespace='AWS/EC2', MetricName='CPUUtilization',
+                                                      StartTime=start_time,
+                                                      EndTime=end_time, Period=60,
+                                                      Statistics=['Average'],
+                                                      Dimensions=[
+                                                          {'Name': 'InstanceId', 'Value': 'i-0596e00c9af077027'}])
+            datas = result['Datapoints']
+            datas.sort(key=getCompareKey)
+            result = []
+            for data in datas:
+                tmp = data
+                utcdt = data['Timestamp']
+                time1 = str(utcdt.astimezone(asj_timezone(timedelta(hours=int(-tz)))))
+                tmp['Timestamp'] = time1[0:time1.find('+')]
+                result.append(tmp)
+            return response.json(0, result)
+        except Exception as e:
+            print(repr(e))
+            return response.json(10, 'AWS Server Error')
+
+
+def getCompareKey(item):
+    return item['Timestamp']
 
 @require_http_methods(["GET"])
 def getUserIds(request):

+ 154 - 4
Controller/CloudVod.py

@@ -128,6 +128,12 @@ class CloudVodView(View):
                 return self.do_pay_status(request_dict, userID)
             elif operation == 'createPayOrder':
                 return self.do_create_pay_order(request_dict, userID, response)
+            # elif operation == 'queryAlipayOrder':
+            #     return self.query_alipay_order(request_dict, userID, response)
+            # elif operation == 'alipayCancel':
+            #     return self.do_alipay_cancel(request_dict, userID, response)
+            # elif operation == 'alipayRefund':
+            #     return self.do_alipay_refund(request_dict, userID, response)
             else:
                 return response.json(414)
 
@@ -157,7 +163,7 @@ class CloudVodView(View):
             print(rank_id)
             UID = order_list[0]['UID']
             channel = order_list[0]['channel']
-            order_qs.update(status=1, updTime=nowTime)
+            order_qs.update(status=1, updTime=nowTime, trade_no=data['trade_no'])
 
             smqs = Store_Meal.objects.filter(id=rank_id).values("day", "bucket_id", "bucket__storeDay")
             bucketId = smqs[0]['bucket_id']
@@ -207,7 +213,7 @@ class CloudVodView(View):
         if not channel or not rank:
             return response.json(444, 'channel,rank')
         smqs = Store_Meal.objects.filter(id=rank). \
-            values("currency", "price", "content", "day", "bucket__storeDay", "bucket__region", "type")
+            values("title", "currency", "price", "content", "day", "bucket__storeDay", "bucket__region", "type")
         if not smqs.exists():
             # 套餐不存在
             return response.json(173)
@@ -236,12 +242,13 @@ class CloudVodView(View):
             order_string = alipay.api_alipay_trade_wap_pay(
                 out_trade_no=orderID,
                 total_amount=price,
-                subject="测试哟",
+                subject=smqs[0]['title'],
                 return_url="{SERVER_DOMAIN_SSL}cloudVod/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
                 notify_url="{SERVER_DOMAIN_SSL}cloudVod/aliPayCallback".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 # return_url="http://192.168.136.40/cloudVod/payOK",
                 # notify_url="http://192.168.136.40/cloudVod/aliPayCallback"
             )
+            print(order_string)
         except Exception as e:
             print(repr(e))
             return response.json(10, repr(e))
@@ -675,7 +682,7 @@ class CloudVodView(View):
             if link.rel == "approval_url":
                 approval_url = str(link.href)
                 print("Redirect for approval: %s" % (approval_url))
-                Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID, desc=content,
+                Order_Model.objects.create(orderID=orderID, UID=uid, trade_no=payment['id'], channel=channel, userID_id=userID, desc=content,
                                            price=price, currency=currency, addTime=nowTime, updTime=nowTime,
                                            endTime=nowTime + int(day) * 3600 * 24,
                                            rank_id=rank,
@@ -777,6 +784,7 @@ class CloudVodView(View):
         paypalrestsdk.configure(PAYPAL_CRD)
         # ID of the payment. This ID is provided when creating payment.
         payment = paypalrestsdk.Payment.find(paymentId)
+        print(payment)
         payres = payment.execute({"payer_id": PayerID})
         print(payres)
         if not payres:
@@ -1188,6 +1196,148 @@ class CloudVodView(View):
             response.content = falil_pay_content
             return response
 
+    def query_alipay_order(self, request_dict, userID, response):
+        out_trade_no = request_dict.get('out_trade_no', None)
+
+        if out_trade_no is None:
+            return response.json(444)
+
+        try:
+            aliPayObj = AliPayObject()
+            alipay = aliPayObj.conf()
+            result = alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
+            print(result)
+        except Exception as e:
+            print(repr(e))
+            return response.json(10, repr(e))
+        return response.json(0, {'result': result})
+
+    def do_alipay_cancel(self, request_dict, userID, response):
+        out_trade_no = request_dict.get('out_trade_no', None)
+
+        if out_trade_no is None:
+            return response.json(444)
+
+        order_qs = Order_Model.objects.filter(orderID=out_trade_no)
+        if not order_qs.exists():
+            return response.json(800)
+
+        order = order_qs[0]
+
+        # 交易状态:
+        # WAIT_BUYER_PAY(交易创建,等待买家付款)
+        # TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)
+        # TRADE_SUCCESS(交易支付成功)
+        # TRADE_FINISHED(交易结束,不可退款)
+
+        try:
+            aliPayObj = AliPayObject()
+            alipay = aliPayObj.conf()
+            result = alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
+            result = result['result']
+
+            if result['code'] == '100000':
+                trade_status = result['trade_status']
+                if trade_status == 'TRADE_CLOSED' or trade_status == 'WAIT_BUYER_PAY':
+                    order.status = 2
+                    order.updTime = int(time.time())
+                    order.save()
+                    return response.json(0)
+                else:
+                    order.status = 1
+                    order.updTime = int(time.time())
+                    order.save()
+                    return response.json(802)
+            else:
+                return response.json(10, result['sub_msg'])
+
+        except Exception as e:
+            print(repr(e))
+            return response.json(10, repr(e))
+
+    def do_alipay_refund(self, request_dict, userID, response):
+        out_trade_no = request_dict.get('out_trade_no', None)
+        refund_amount = request_dict.get('refund_amount', None)
+        reason = request_dict.get('reason', '正常退款')
+
+        if out_trade_no is None:
+            return response.json(444)
+
+        order_qs = Order_Model.objects.filter(orderID=out_trade_no)
+
+        if not order_qs.exists():
+            return response.json(800)
+
+        order = order_qs[0]
+        if refund_amount > order.price:
+            return response.json(801)
+
+        try:
+            # extra = {
+            #     'refund_currency': order[0].currency
+            # }
+            aliPayObj = AliPayObject()
+            alipay = aliPayObj.conf()
+            result = alipay.api_alipay_trade_refund(refund_amount=refund_amount, out_trade_no=out_trade_no)
+            result = result['result']
+            print(result)
+            if result['code'] == '10000':
+                order.status = 3
+                order.updTime = int(time.time())
+                order.save()
+                return response.json(0)
+            else:
+                return response.json(10, result['sub_msg'])
+
+        except Exception as e:
+            print(repr(e))
+            return response.json(10, repr(e))
+
+    def do_paypal_refund(self, request_dict, userID, response):
+        out_trade_no = request_dict.get('out_trade_no', None)
+        refund_amount = request_dict.get('refund_amount', None)
+
+        order_qs = Order_Model.objects.filter(orderID=out_trade_no, userID__userID=userID)
+
+        if not order_qs.exists():
+            return response.json(800)
+
+        order = order_qs[0]
+
+        refund_amount = float(refund_amount)
+        if order.price < refund_amount:
+            return response.json(801)
+
+        paypalrestsdk.configure(PAYPAL_CRD)
+        payment = paypalrestsdk.Payment.find(order.trade_no)
+        transactions = payment['transactions']
+        transaction = transactions[0]
+        related_resources = transaction['related_resources']
+        if len(related_resources) > 0:
+            related_resource = related_resources[0]
+            sale = related_resource['sale']
+            id = sale['id']
+
+            if sale['state'] == 'completed':
+                paypalSale = paypalrestsdk.Sale.find(id)
+                refund = paypalSale.refund({
+                    'amount': {
+                        'total': refund_amount,
+                        'currency': order.currency
+                    }
+                })
+
+                if refund.success():
+                    return response.json(0)
+                else:
+                    return response.json(10, refund.error)
+            elif sale['state'] == 'refunded':
+                return response.json(804)
+        else:
+            return response.json(804)
+
+
+
 
 def deleteVodHls(request):
     response = ResponseObject()

+ 3 - 19
Controller/EquipmentManager.py

@@ -3,6 +3,8 @@ import time
 import traceback
 import threading
 import logging
+
+import requests
 import simplejson as json
 from django.utils import timezone
 from Model.models import Device_User, Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel
@@ -94,10 +96,6 @@ def addNewUserEquipmentInterface(request):
                 userDevice = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=userID,
                                          **deviceData)
                 userDevice.save()
-                if UID == '98UXAA8BRPA35VAL111A':
-                    asy = threading.Thread(target=ModelService.add_log,
-                                           args=(CommonService.get_ip_address(request), userID, 'addV0'))
-                    asy.start()
 
                 # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
                 # # 判断是否有已绑定用户
@@ -160,14 +158,12 @@ def delUserEquipmentInterface(request):
         # redisObj.del_data(key='uid_qs_' + userID)
         if dv_qs.exists():
             uid = dv_qs[0].UID
-            asy = threading.Thread(target=ModelService.delete_log,
-                                   args=(CommonService.get_ip_address(request), userID, 'deleteV1', uid))
-            asy.start()
             print('删除')
             UID_Preview.objects.filter(uid=uid).delete()
             dv_qs.delete()
             asy = threading.Thread(target=ModelService.del_eq_info, args=(userID, uid))
             asy.start()
+
     except Exception as e:
         errorInfo = traceback.format_exc()
         print('删除数据库记录错误: %s' % errorInfo)
@@ -224,10 +220,6 @@ def modifyUserEquipmentInterface(request):
         res = CommonService.qs_to_dict(qs)
         if qs.exists():
             uid = qs[0].UID
-            if uid == '98UXAA8BRPA35VAL111A':
-                asy = threading.Thread(target=ModelService.update_log,
-                                       args=(CommonService.get_ip_address(request), userID, 'modifyV0', deviceContent, id))
-                asy.start()
             nickname = qs[0].NickName
             # 增加设备影子信息修改昵称 start
             us_qs = UidSetModel.objects.filter(uid=uid)
@@ -374,11 +366,6 @@ def addInterface(request):
                         return response.json(174)
                     else:
                         is_exist.delete()
-                if UID == '98UXAA8BRPA35VAL111A':
-                    asy = threading.Thread(target=ModelService.add_log,
-                                           args=(CommonService.get_ip_address(request), userID, 'addV1'))
-                    asy.start()
-                    return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
                 pass
                 # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
                 # # 判断是否有已绑定用户
@@ -679,9 +666,6 @@ def deleteInterface(request):
         dv_qs = Device_Info.objects.filter(userID_id=userID, id=id)
         if dv_qs.exists():
             uid = dv_qs[0].UID
-            asy = threading.Thread(target=ModelService.delete_log,
-                                   args=(CommonService.get_ip_address(request), userID, 'deleteV2', uid))
-            asy.start()
             if dv_qs[0].isShare:
                 dv_qs.delete()
             else:

+ 8 - 19
Controller/EquipmentManagerV3.py

@@ -2,6 +2,9 @@ import re
 import threading
 import time
 import traceback
+
+import requests
+
 from Controller.CheckUserData import RandomStr
 import oss2, base64
 from django.db.models import Q
@@ -24,6 +27,7 @@ class EquipmentManagerV3(View):
 
     def post(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
+
         operation = kwargs.get('operation')
         return self.validation(request.POST, request, operation)
 
@@ -60,7 +64,6 @@ class EquipmentManagerV3(View):
 
         if all([UID, NickName, View_Account, Type, ChannelIndex]):
             tko = TokenObject(token)
-
             response.lang = tko.lang
             if tko.code == 0:
                 userID = tko.userID
@@ -73,11 +76,6 @@ class EquipmentManagerV3(View):
                             return response.json(174)
                         else:
                             is_exist.delete()
-                    if UID == '98UXAA8BRPA35VAL111A':
-                        asy = threading.Thread(target=ModelService.add_log,
-                                               args=(CommonService.get_ip_address(request), userID, 'addV3'))
-                        asy.start()
-                        return response.json(10, 'illegal uid: {uid}'.format(uid=UID))
                     # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
                     # # 判断是否有已绑定用户
                     # if is_bind:
@@ -103,14 +101,6 @@ class EquipmentManagerV3(View):
                                                  NickName=NickName, View_Account=View_Account,
                                                  View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex)
                         userDevice.save()
-
-                        if not us_qs.exists():
-                            us_qs = UidSetModel.objects.filter(uid=UID)
-
-                        if us_qs.exists() and us_qs[0].is_alexa == 1:
-                            asy = threading.Thread(target=ModelService.notify_alexa_add, args=(UID, userID, NickName))
-                            asy.start()
-
                         # redisObj = RedisObject(db=8)
                         # redisObj.del_data(key='uid_qs_' + userID)
                     except Exception as e:
@@ -150,6 +140,8 @@ class EquipmentManagerV3(View):
         userID = tko.userID
         if userID is None:
             return response.json(309)
+        deviceData = None
+        dev_info_qs = None
         try:
             # deviceData = json.loads(deviceContent)
             deviceData = eval(deviceContent)
@@ -176,15 +168,12 @@ class EquipmentManagerV3(View):
             res = CommonService.qs_to_dict(qs)
             if qs.exists():
                 uid = qs[0].UID
-                if uid == '98UXAA8BRPA35VAL111A':
-                    asy = threading.Thread(target=ModelService.update_log,
-                                           args=(CommonService.get_ip_address(request), userID, 'modifyV3', deviceData, id))
-                    asy.start()
                 nickname = qs[0].NickName
                 # 增加设备影子信息修改昵称 start
                 us_qs = UidSetModel.objects.filter(uid=uid)
                 if us_qs.exists():
-                    us_qs.update(nickname=nickname)
+                    if deviceData.__contains__('NickName'):
+                        us_qs.update(nickname=nickname)
                 else:
                     ChannelIndex = qs[0].ChannelIndex
                     nowTime = int(time.time())

+ 149 - 1
Controller/OrderContrller.py

@@ -12,9 +12,14 @@
 @Contact: chanjunkai@163.com
 """
 import time
+
+import paypalrestsdk
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
+
+from Ansjer.config_test import PAYPAL_CRD
+from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Model.models import Order_Model, Device_Info
@@ -50,7 +55,7 @@ class OrderView(View):
         token = request_dict.get('token', None)
         # 设备主键uid
         tko = TokenObject(token)
-        response.lang = tko.lang
+        response.lang = request_dict.get('language', 'en')
         if tko.code != 0:
             return response.json(tko.code)
         userID = tko.userID
@@ -62,6 +67,14 @@ class OrderView(View):
             return self.do_admin_query(request_dict, userID, response)
         elif operation == 'detail':
             return self.do_detail(request_dict, userID, response)
+        elif operation == 'queryByStatus':
+            return self.do_query_order_by_status(request_dict, userID, response)
+        elif operation == 'orderDetail':
+            return self.do_query_order_detail(request_dict, userID, response)
+        elif operation == 'cancel':
+            return self.do_cancel_order(request_dict, userID, response)
+        elif operation == 'delete':
+            return self.do_delete_order(request_dict, userID, response)
         else:
             return response.json(444, 'error path')
 
@@ -157,3 +170,138 @@ class OrderView(View):
 
         else:
             return response.json(404)
+
+    def do_query_order_by_status(self, request_dict, userID, response):
+        status = request_dict.get('status', None)
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+
+        if status and page and line:
+            order_qs = None
+            status = int(status)
+            if status == -1: # 获取所有订单
+                order_qs = Order_Model.objects.filter(userID__userID=userID)
+            elif status == 0: # 获取【代付款】订单
+                order_qs = Order_Model.objects.filter(userID__userID=userID, status=0)
+            elif status == 1:
+                order_qs = Order_Model.objects.filter(userID__userID=userID, status=1)
+
+            if order_qs is None or not order_qs.exists():
+                return response.json(0, {'data': [], 'count': 0})
+
+            page = int(page)
+            line = int(line)
+            start = (page - 1) * line
+            end = status + line
+            count = order_qs.count()
+            order_qs = order_qs[start:end].values("orderID", "UID", "channel", "desc", "price",
+                                                  "currency", "addTime", "payType", "rank__day", "rank__price",
+                                                  "status", 'channel', "rank__title", "currency")
+            return response.json(0, {'data': list(order_qs), 'count': count})
+        else:
+            return response.json(444)
+
+    def do_query_order_detail(self, request_dict, userID, response):
+        orderID = request_dict.get('orderID', None)
+
+        if orderID:
+            order_qs = Order_Model.objects.filter(orderID=orderID, userID__userID=userID)
+            if order_qs.exists():
+                print(order_qs)
+                order = order_qs.values("orderID", "UID", "channel", "desc", "price",
+                                        "currency", "addTime", "endTime", "payType",
+                                        "rank__day", "rank__price", "status", 'channel', "rank__title", "currency")[0]
+
+                return response.json(0, {'data': order})
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_cancel_order(self, request_dict, userID, response):
+        orderID = request_dict.get('orderID', None)
+
+        if orderID is None:
+            return response.json(444)
+
+        order_qs = Order_Model.objects.filter(orderID=orderID)
+        if not order_qs.exists():
+            return response.json(800)
+
+        order = order_qs[0]
+        if order.status != 0:
+            return response.json(802)
+
+        if order.payType == 1: # 支付宝支付的订单
+            return self.do_cancel_alipay_order(order, response)
+        else:
+            return self.do_cancel_paypal_order(order, response)
+
+    def do_delete_order(self, request_dict, userID, response):
+        orderID = request_dict.get('orderID', None)
+
+        if orderID:
+            Order_Model.objects.filter(orderID=orderID, userID__userID=userID).delete()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_cancel_alipay_order(self, order, response):
+        # 交易状态:
+        # WAIT_BUYER_PAY(交易创建,等待买家付款)
+        # TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)
+        # TRADE_SUCCESS(交易支付成功)
+        # TRADE_FINISHED(交易结束,不可退款)
+
+        try:
+            aliPayObj = AliPayObject()
+            alipay = aliPayObj.conf()
+            result = alipay.api_alipay_trade_query(out_trade_no=order.orderID)
+            print(result)
+
+            if result['code'] == '100000':
+                trade_status = result['trade_status']
+                if trade_status == 'TRADE_CLOSED' or trade_status == 'WAIT_BUYER_PAY':
+                    order.status = 2
+                    order.updTime = int(time.time())
+                    order.save()
+                    return response.json(0)
+                elif trade_status == 'TRADE_SUCCESS':
+                    order.status = 1
+                    order.updTime = int(time.time())
+                    order.save()
+                    return response.json(802)
+            elif result['code'] == '40004':
+                order.status = 2
+                order.updTime = int(time.time())
+                order.save()
+                return response.json(0)
+            else:
+                return response.json(10, result['sub_msg'])
+
+        except Exception as e:
+            print(repr(e))
+            return response.json(10, repr(e))
+
+    def do_cancel_paypal_order(self, order, response):
+        paypalrestsdk.configure(PAYPAL_CRD)
+        payment = paypalrestsdk.Payment.find(order.trade_no)
+        transactions = payment['transactions']
+        transaction = transactions[0]
+        related_resources = transaction['related_resources']
+        if len(related_resources) > 0:
+            related_resource = related_resources[0]
+            sale = related_resource['sale']
+            if sale['state'] == 'completed':
+                order.status = 1
+            elif sale['state'] == 'refunded':
+                order.status = 3
+
+            order.updTime = int(time.time())
+            order.save()
+            return response.json(802)
+
+        order.status = 2
+        order.updTime = int(time.time())
+        order.save()
+        return response.json(0)

+ 122 - 1
Controller/StatisticsController.py

@@ -7,7 +7,7 @@ from django.db.models import Count
 from django.views.decorators.csrf import csrf_exempt
 
 from Model.models import UserAppFrequencyModel, AppFrequencyStatisticsModel, Device_User, \
-    AppFrequencyYearStatisticsModel
+    AppFrequencyYearStatisticsModel, Equipment_Info, EquipmentInfoExStatisticsModel
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 
@@ -40,13 +40,17 @@ def statistcsAppFrequency(request):
 
     time_struct = [current_year, 1, 1, 0, 0, 0, 0, 0, 0]
 
+    distance_time = 8 * 60 * 60
+
     # 该月的开始时间
     time_struct[1] = current_month
     start_time = time.mktime(tuple(time_struct))
+    start_time = start_time - time.timezone - distance_time
 
     # 该月的结束时间
     time_struct[1] = current_month + 1
     end_time = time.mktime(tuple(time_struct))
+    end_time = end_time - time.timezone - distance_time
 
     # 统计该月的数据
     uaf_qs = UserAppFrequencyModel.objects.filter(data_time__gte=start_time, data_time__lt=end_time) \
@@ -135,3 +139,120 @@ def statistcsAppFrequencyYear(request):
         }
         AppFrequencyYearStatisticsModel.objects.create(**data)
     return response.json(0)
+
+
+@csrf_exempt
+def statistcsPushDay(request):
+    request.encoding = 'utf-8'
+    response = ResponseObject()
+    if request.method == 'POST':
+        request_dict = request.POST
+    elif request.method == 'GET':
+        request_dict = request.GET
+    else:
+        return response.json(444)
+
+    token = TokenObject(request_dict.get('token', None))
+    if token.code != 0:
+        return response.json(token.code)
+
+    current_time = int(time.time())
+    count = int((current_time + 8 * 3600) / (24 * 3600))
+    end_time = count * 24 * 3600 - 8 * 3600
+    start_time = end_time - 24 * 3600
+    print(start_time)
+    print(end_time)
+
+    eq_qs = Equipment_Info.objects.filter(addTime__gte=start_time, addTime__lte=end_time)
+    print(eq_qs.values())
+    # 0:APNS推送,1:谷歌推送,2:极光推送
+    now_time = int(time.time())
+    jpush = EquipmentInfoExStatisticsModel(push_type=2, statistics_date=start_time, add_time=now_time, date_type=0)
+    apns = EquipmentInfoExStatisticsModel(push_type=0, statistics_date=start_time, add_time=now_time, date_type=0)
+    gcm = EquipmentInfoExStatisticsModel(push_type=1, statistics_date=start_time, add_time=now_time, date_type=0)
+    total = EquipmentInfoExStatisticsModel(push_type=-1, statistics_date=start_time, add_time=now_time, date_type=0)
+    for eq in eq_qs:
+        if eq.push_type == 0:
+            do_sum(eq, apns)
+        elif eq.push_type == 1:
+            do_sum(eq, gcm)
+        elif eq.push_type == 2:
+            do_sum(eq, jpush)
+        do_sum(eq, total)
+    datas = []
+    datas.append(apns)
+    datas.append(gcm)
+    datas.append(jpush)
+    datas.append(total)
+
+    EquipmentInfoExStatisticsModel.objects.bulk_create(datas)
+    return response.json(0)
+
+
+@csrf_exempt
+def statistcsPushMonth(request):
+    request.encoding = 'utf-8'
+    response = ResponseObject()
+    if request.method == 'POST':
+        request_dict = request.POST
+    elif request.method == 'GET':
+        request_dict = request.GET
+    else:
+        return response.json(444)
+
+    token = TokenObject(request_dict.get('token', None))
+    if token.code != 0:
+        return response.json(token.code)
+
+    gmtime = time.gmtime(int(time.time()) + 28800)
+    current_month = gmtime.tm_mon - 1
+    # print(current_month)
+
+    time_struct = [gmtime.tm_year, current_month, 1, 0, 0, 0, 0, 0, gmtime.tm_isdst]
+    start_time = int(time.mktime(tuple(time_struct))) - 28800
+    # print(start_time)
+
+    time_struct[1] = current_month + 1
+    end_time = int(time.mktime(tuple(time_struct))) - 28800
+    # print(end_time)
+
+    eq_qs = EquipmentInfoExStatisticsModel.objects.filter(statistics_date__gte=start_time, statistics_date__lte=end_time, date_type=0)
+    # 0:APNS推送,1:谷歌推送,2:极光推送
+    now_time = int(time.time())
+    jpush = EquipmentInfoExStatisticsModel(push_type=2, statistics_date=start_time, add_time=now_time, date_type=1)
+    apns = EquipmentInfoExStatisticsModel(push_type=0, statistics_date=start_time, add_time=now_time, date_type=1)
+    gcm = EquipmentInfoExStatisticsModel(push_type=1, statistics_date=start_time, add_time=now_time, date_type=1)
+    total = EquipmentInfoExStatisticsModel(push_type=-1, statistics_date=start_time, add_time=now_time, date_type=1)
+    for eq in eq_qs:
+        if eq.push_type == 0:
+            do_sum_two(eq, apns)
+        elif eq.push_type == 1:
+            do_sum_two(eq, gcm)
+        elif eq.push_type == 2:
+            do_sum_two(eq, jpush)
+        elif eq.push_type == -1:
+            do_sum_two(eq, total)
+    datas = []
+    datas.append(apns)
+    datas.append(gcm)
+    datas.append(jpush)
+    datas.append(total)
+
+    EquipmentInfoExStatisticsModel.objects.bulk_create(datas)
+    return response.json(0)
+
+
+def do_sum(eq: Equipment_Info, target: EquipmentInfoExStatisticsModel):
+    if eq.push_server_status == 200:
+        target.number_of_successes += 1
+    else:
+        target.number_of_failures += 1
+
+    if eq.push_device_status == 1:
+        target.number_of_arrival += 1
+
+
+def do_sum_two(eq: EquipmentInfoExStatisticsModel, target: EquipmentInfoExStatisticsModel):
+    target.number_of_successes += eq.number_of_successes
+    target.number_of_failures += eq.number_of_failures
+    target.number_of_arrival += eq.number_of_arrival

+ 3 - 2
Controller/UserController.py

@@ -3342,12 +3342,13 @@ class AppleAuthLogin(View):
 
         response = ResponseObject(lang)
         identity_token = CommonService.decode_data(identity_token)
+        # print(identity_token)
         if identity_token:
             key_url = 'https://appleid.apple.com/auth/keys'
             key_response = requests.get(key_url).json()
-            print(key_response)
+            # print(key_response)
             head = jwt.get_unverified_header(identity_token)
-            print(head)
+            # print(head)
             token_key = head['kid']
             key_object = None
             alg = None

+ 25 - 7
Model/models.py

@@ -22,7 +22,7 @@ class PermissionsManager(models.Manager):
 
 class RoleManager(models.Manager):
     """
-    The manager for the auth's Role model.
+    The manager for the auth's Role model..
     """
     use_in_migrations = True
 
@@ -290,10 +290,6 @@ class Equipment_Info(models.Model):
     receiveTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
     userID_id = models.CharField(default='', blank=True, max_length=32, verbose_name=u'用户ID')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图')  # 0 否,1 是图,2,视频
-    # message_id = models.CharField(max_length=32, default='', verbose_name='第三方推送服务器返回的id')
-    # push_type = models.SmallIntegerField(default=0, verbose_name='第三方推送服务器标志。0:APNS推送,1:谷歌推送,2:极光推送')
-    # push_server_status = models.IntegerField(default=200, verbose_name='是否成功推送到第三方服务器。200:成功,other:失败')
-    # push_device_status = models.SmallIntegerField(default=-1, verbose_name='是否成功推送到目标设备。0:失败,1:成功')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
 
     def __str__(self):
@@ -513,6 +509,7 @@ class App_Colophon(models.Model):
 
 class Order_Model(models.Model):
     orderID = models.CharField(blank=True, max_length=20, primary_key=True, verbose_name=u'订单id')
+    trade_no = models.CharField(blank=True, max_length=32, default='', verbose_name='第三方订单号')
     # 订单关联用户
     userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)
     UID = models.CharField(max_length=20, verbose_name='设备UID')
@@ -523,7 +520,7 @@ class Order_Model(models.Model):
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
     endTime = models.IntegerField(verbose_name='结束时间', default=0)
-    status = models.SmallIntegerField(default=0, verbose_name='付款状态')  # 0:否,1:成功
+    status = models.SmallIntegerField(default=0, verbose_name='付款状态')  # 0:待支付,1:成功,2:取消,3:已退款
     payType = models.SmallIntegerField(default=0, verbose_name='付款类型0:paypal,1:alipay')
     payTime = models.IntegerField(verbose_name='支付成功时间', default=0)
     rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='套餐类型')
@@ -668,7 +665,7 @@ class UidSetModel(models.Model):
     version = models.CharField(max_length=32, verbose_name='设备版本', default='')
     p2p_region = models.CharField(max_length=16, verbose_name='设备p2p区域', default='ALL')  # ALL CN EU US
     cloud_vod = models.SmallIntegerField(default=2, verbose_name='云存开关')  # 0,关闭,1开启,2,不支持
-    tz = models.CharField(default='', max_length=16, verbose_name='设备时区')  # +8
+    tz = models.CharField(default='', max_length=16, verbose_name ='设备时区')  # +8
     video_code = models.SmallIntegerField(default=0, verbose_name='编码类型')  # 0:264,1:265
     nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')
     ip = models.CharField(max_length=20, default='', verbose_name=u'设备ip')
@@ -993,3 +990,24 @@ class AppLogModel(models.Model):
         db_table = 'app_log'
         verbose_name = 'APP日志表'
         verbose_name_plural = verbose_name
+
+
+class EquipmentInfoExStatisticsModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    push_type = models.SmallIntegerField(default=0, verbose_name='第三方推送服务器标志。0:APNS推送,1:谷歌推送,2:极光推送')
+    number_of_successes = models.IntegerField(default=0, verbose_name='推送成功数量')
+    number_of_failures = models.IntegerField(default=0, verbose_name='推送失败数量')
+    number_of_arrival = models.IntegerField(default=0, verbose_name='推送到达数量')
+    statistics_date = models.IntegerField(default=0, verbose_name='属于哪天、哪月的统计')
+    date_type = models.SmallIntegerField(default=0, verbose_name='统计日期的类型。0:天,1:月')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'equipment_info_ex_statistics'
+        verbose_name = '推送消息统计表'
+        verbose_name_plural = verbose_name
+
+
+
+
+

+ 8 - 0
Object/ResponseObject.py

@@ -56,6 +56,10 @@ class ResponseObject(object):
             712: 'Area needs to be consistent',
             713: 'Storage rules cannot be changed during the validity period',
             717: 'Authorization expires',
+            800: 'Order does not exist',
+            801: 'The refund amount cannot be greater than the order price',
+            802: 'The order has been completed and cannot be cancelled',
+            804: 'Refund, please do not repeat the operation',
             900: 'There is no information about this version!',
             901: 'Getting URL failure!',
             902: 'No update!',
@@ -119,6 +123,10 @@ class ResponseObject(object):
             712: '区域不一致',
             713: '有效期内不可更改存储规则',
             717: '授权过期',
+            800: '订单不存在',
+            801: '退款金额不能大于订单价格',
+            802: '订单已完成,不能撤销',
+            804: '订单已退款,请勿重复操作',
             900: '版本信息不存在',
             901: '获取链接失败',
             902: '无更新!',

+ 2 - 23
Service/ModelService.py

@@ -168,37 +168,16 @@ class ModelService:
             'uid_nick': nickname
         }
         try:
-            res = requests.post(url, data=data, timeout=10)
+            requests.post(url, data=data, timeout=5)
         except Exception as e:
             print(repr(e))
 
     @staticmethod
     def add_log(ip, userID, operation):
-        file_path = '/'.join((BASE_DIR, 'static/add_device.log'))
-        file = open(file_path, 'a+')
-        file.write(ip + "; username:" + userID + "; time:" + time.strftime(
-            "%Y-%m-%d %H:%M:%S", time.localtime()) + "; " + operation)
-        file.write('\n')
-        file.flush()
-        file.close()
-
-    @staticmethod
-    def update_log(ip, userID, operation, content, id):
-        content['xid'] = id
-        file_path = '/'.join((BASE_DIR, 'static/update_device.log'))
-        file = open(file_path, 'a+')
-        file.write(ip + "; username:" + userID + "; time:" + time.strftime(
-            "%Y-%m-%d %H:%M:%S", time.localtime()) + "; content:" + json.dumps(content) + "; " + operation)
-        file.write('\n')
-        file.flush()
-        file.close()
-
-    @staticmethod
-    def delete_log(ip, userID, operation, UID):
         file_path = '/'.join((BASE_DIR, 'static/delete_device.log'))
         file = open(file_path, 'a+')
         file.write(ip + "; username:" + userID + "; time:" + time.strftime(
-            "%Y-%m-%d %H:%M:%S", time.localtime()) + "; " + operation + "; uid:" + UID)
+                "%Y-%m-%d %H:%M:%S", time.localtime()) + "; " + operation)
         file.write('\n')
         file.flush()
         file.close()