Bladeren bron

Merge branch 'v3.0-app' of http://118.190.145.217:3000/xiaojincai/wanzb_v3_api into v3.0-app

xjconline 1 jaar geleden
bovenliggende
commit
03887ce09b
9 gewijzigde bestanden met toevoegingen van 2662 en 2551 verwijderingen
  1. 2 0
      src/common/models.py
  2. 5 3
      src/manage/controls.py
  3. 13 10
      src/manage/views.py
  4. 4 1
      src/settings/settings_online.py
  5. 2508 2506
      src/tools/code.csv
  6. 55 25
      src/utils/plottool.py
  7. 54 3
      src/weixin/controls.py
  8. 1 0
      src/weixin/urls_backstage.py
  9. 20 3
      src/weixin/views.py

+ 2 - 0
src/common/models.py

@@ -160,6 +160,7 @@ class Match(models.Model):
     signup_start_time = models.CharField(u"报名开始时间", max_length=255, blank=True,null=True)
     signup_end_time = models.CharField(u"报名结束时间", max_length=255, blank=True,null=True)
     post_start_time = models.CharField(u"交作业开始时间", max_length=255, blank=True,null=True)
+    awards_content = models.TextField(u"奖项内容", max_length=255, blank=True,null=True)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -286,6 +287,7 @@ class Article(models.Model):
     status = models.SmallIntegerField(u"下线/上线/编辑中-1/2/1",default=1)
     isbanner = models.SmallIntegerField(u"是否banner",default=0)
     category = models.CharField(u"类型", max_length=255, blank=True,null=True)         
+    ishot = models.SmallIntegerField(u"是否精选",default=0)
                                                                                    
     ctime = models.DateTimeField(u"创建时间",auto_now_add=True)                    
     class Meta:                                                                    

+ 5 - 3
src/manage/controls.py

@@ -471,6 +471,8 @@ def get_list_info(cls,**kwargs):
             qset = qset.filter(category=kwargs.get("category"))
         if kwargs.get("isbanner"):
             qset = qset.filter(isbanner=kwargs.get("isbanner"))
+        if kwargs.get("ishot"):
+            qset = qset.filter(ishot=kwargs.get("ishot"))
     if model_name == "Stock":
         if kwargs.get("username"):
             qset = qset.filter(name__icontains=kwargs.get("username"))
@@ -710,12 +712,12 @@ def download_records_image(request):
     if kwargs.get("stock_date"):
         qset = qset.filter(stock_date=kwargs.get("stock_date"))
         if match_group_name:
-            title = u'{}-{}-{}'.format(match_name, match_group_name, kwargs.get("stock_date")[5:])
+            title = u'{}-{}-{}'.format(match_name[:7], match_group_name, kwargs.get("stock_date")[5:])
         else:
-            title = u'{}-{}'.format(match_name, kwargs.get("stock_date")[5:])
+            title = u'{}-{}'.format(match_name[:7], kwargs.get("stock_date")[5:])
     else:
         if match_group_name:
-            title = u'{}-{}'.format(match_name, match_group_name)
+            title = u'{}-{}'.format(match_name[:7], match_group_name)
         else:
             title = match_name
 

+ 13 - 10
src/manage/views.py

@@ -286,7 +286,8 @@ class MatchView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
-            need_params.extend(["calendar","valid_dates","player_price","viewer_price","match_status","signup_start_time","signup_end_time","post_start_time"])
+            need_params.extend(["calendar","valid_dates","player_price","viewer_price",
+                "match_status","signup_start_time","signup_end_time","post_start_time","awards_content"])
             vals = ccf.get_need_params(*need_params,**qdata)
             vals["valid_dates"] = json.dumps(vals["valid_dates"])
             rst = ctl.add_model(self,**vals)
@@ -308,7 +309,8 @@ class MatchView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
-            need_params.extend(["calendar","valid_dates","signup_start_time","signup_end_time","match_status","post_start_time"])
+            need_params.extend(["calendar","valid_dates","signup_start_time","signup_end_time",
+                "match_status","post_start_time","awards_content"])
             vals = ccf.get_need_params(*need_params,**qdata)
             vals["valid_dates"] = json.dumps(vals["valid_dates"])
             rst = ctl.update_model(self,**vals)
@@ -611,20 +613,21 @@ class PlayerRecordDownloadView(cv.AdminView):
             return cv.to_fail(e)
 
 
-class PlayerRecordDownloadImageView(cv.AdminView):
+class PlayerRecordDownloadImageView(cv.BaseView):
     def get(self, request):
         """download player record as image
         """
         try:
-            r = ctl.download_records_image(request)
-            if r is None:
-                return cv.to_fail('ret is None')
-            return cv.to_suc(r)
+            zipfile = ctl.download_records_image(request)
+            wrapper = FileWrapper(zipfile)
+            response = HttpResponse(wrapper, content_type='application/zip')    
+            response['Content-Disposition'] = 'attachment;filename={}'\
+                 .format(ccf.datetime_to_str(datetime.datetime.now(),"%Y%m%d%H%M%S")+".zip")
+            return response                                                     
         except Exception as e:
             cv.tracefail()
             return cv.to_fail(e)
 
-
 class PlayerFastSaveView(cv.AdminView):
 
     def gen_code(self):
@@ -708,7 +711,7 @@ class ArticleView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
-            need_params.extend(["type","img","category","isbanner"])
+            need_params.extend(["type","img","category","isbanner","ishot"])
             vals = ccf.get_need_params(*need_params,**qdata)
             rst = ctl.add_model(self,**vals)
             return cv.to_suc(rst)
@@ -728,7 +731,7 @@ class ArticleView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
-            need_params.extend(["type","img","category","isbanner"])
+            need_params.extend(["type","img","category","isbanner","ishot"])
             vals = ccf.get_need_params(*need_params,**qdata)
             rst = ctl.update_model(self,**vals)
             return cv.to_suc(rst)

+ 4 - 1
src/settings/settings_online.py

@@ -30,7 +30,10 @@ DATABASES = {
         'PASSWORD': 'wanzb890*()',
         'HOST': '172.29.110.52',
         'PORT': '3306',
-        'OPTIONS':{'charset':'utf8mb4'},
+        'OPTIONS':{
+            'charset':'utf8mb4',
+            "connect_timeout":120
+        },
         'CONN_MAX_AGE': 9
     }
 }

File diff suppressed because it is too large
+ 2508 - 2506
src/tools/code.csv


+ 55 - 25
src/utils/plottool.py

@@ -3,6 +3,8 @@ import re
 import StringIO
 import uuid
 import logging
+import zipfile,os
+import tempfile
 
 import matplotlib as mpl
 mpl.use('Agg')
@@ -10,24 +12,38 @@ mpl.rcParams['font.family'] = ['SimHei', 'sans-serif']
 
 import matplotlib.pyplot as plt
 import matplotlib.table as tb
-
-from utils.upload_to_oss import hnoss
+#from utils.upload_to_oss import hnoss
+
+def get_zipfile(files):                                                             
+    """                                                                            
+    """                                                                             
+    path = os.path.split(files[0])[0]                                               
+    temp = tempfile.TemporaryFile()                                                 
+    archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
+    for f in files:
+        fname = os.path.split(f)[-1]
+        archive.write(f,fname)
+        os.remove(f)
+    archive.close()
+    temp.seek(0)
+    return temp
 
 
 def plot_records_as_table_and_convert_to_png(
     (nrows, ncols),
     data,
     col_headers=None,
-    title=None):
+    title=None,localfile=None):
     """
     visual records
     """
     fig_width = ncols
-    offset = 0
+    h_offset = t_offset = 0
     if col_headers:
-        offset += 1
+        h_offset = 1
     if title:
-        offset += 1
+        t_offset = 1
+    offset = h_offset + t_offset
     fig_height = offset * 2
 
     table_data = []
@@ -52,27 +68,34 @@ def plot_records_as_table_and_convert_to_png(
 
     if title:
         for i in range(ncols):
-            table.add_cell(0, i, width=widths[i], height=height * 2, edgecolor='red', facecolor='red', loc='right')
+            table.add_cell(0, i, width=widths[i], height=height * 4, edgecolor='red', facecolor='red', loc='right')
         table[0, 6].get_text().set_text(title)
-        table[0, 6].set_fontsize(14)
+        table[0, 6].set_fontsize(25)
+        table[0, 6].set_text_props(weight='bold')
         table[0, 6].get_text().set_color('yellow')
 
     if col_headers:
         for i in range(ncols):
-            table.add_cell(1, i, width=widths[i], height=height * 2, facecolor='yellow', text=col_headers[i], loc='center')
-            # table[1, i].set_fontsize(10)
+            table.add_cell(t_offset, i, width=widths[i], height=height * 2, facecolor='yellow', text=col_headers[i], loc='center')
+            table[t_offset, i].set_fontsize(12)
+            table[t_offset, i].set_edgecolor('grey')
 
     for i in range(nrows):
         for j in range(ncols):
             table.add_cell(i + offset, j, width=widths[j], height=height*row_heights_mul[i], text=table_data[i][j], loc='center')
-            # table[i + offset, j].set_fontsize(10)
+            table[i + offset, j].set_fontsize(14)
+            table[i + offset, j].set_edgecolor('grey')
             if not table_data[i][5].startswith('-'):
                 table[i + offset, j].get_text().set_color('red')
 
     ax.add_table(table)
-    buf = StringIO.StringIO()
-    plt.savefig(buf, format='png')
-    return buf.getvalue()
+    if localfile:
+        plt.savefig(localfile, format='png')
+        return localfile
+    else:
+        buf = StringIO.StringIO()
+        plt.savefig(buf, format='png')
+        return buf.getvalue()
 
 
 def plot_records(data, col_headers, title, prefix):
@@ -82,33 +105,40 @@ def plot_records(data, col_headers, title, prefix):
     ncols = len(col_headers) if col_headers else len(data[0])
 
     ret = []
+    files = []
     start = 0
-    step = 100
+    step = 120
     while True:
+    	if start==0 and ('百万组' in title or '十万组' in title or '菜鸟组' in title ):
+    		step = 10
+    	else:
+    		step = 120
+    		
         part = data[start: start + step]
         part_nrows = len(part)
+        filename = u'/tmp/{}-{}.png'.format(title.split('-')[1], start)
 
         if start == 0:
             png_bytes = plot_records_as_table_and_convert_to_png(
                 (part_nrows, ncols),
                 part,
                 col_headers,
-                title)
+                title,filename)
         else:
             png_bytes = plot_records_as_table_and_convert_to_png(
                 (part_nrows, ncols),
-                part)
-        filename = u'{}-第{}-{}名.png'.format(title, start + 1, start + part_nrows)
+                part,None,None,filename)
         logging.error(filename)
-        image_url = hnoss.upload_from_str(
-            png_bytes,
-            '{}_{}.png'.format(prefix, uuid.uuid4().hex),
-            False)
-        ret.append({'filename': filename, 'image_url': image_url})
+        files.append(filename)
+        #image_url = hnoss.upload_from_str(
+        #    png_bytes,
+        #    '{}_{}.png'.format(prefix, uuid.uuid4().hex),
+        #    False)
+        #ret.append({'filename': filename, 'image_url': image_url})
 
         start += step
         if start >= nrows:
             break
-
-    return ret
+    zpfile = get_zipfile(files)
+    return zpfile
 

+ 54 - 3
src/weixin/controls.py

@@ -1647,7 +1647,7 @@ def get_champion_articles_list(request):
     _type = kwargs.get("type")
     isbanner = kwargs.get("isbanner")
     category = kwargs.get("category")
-    qset = cm.Article.objects.filter(status=2).exclude(type="notice").order_by("-id")
+    qset = cm.Article.objects.filter(status=2).exclude(type="notice").order_by("-isbanner","-ishot","-id")
     if _type:
         qset = qset.filter(type=_type)
     if isbanner:
@@ -3432,8 +3432,8 @@ def get_match_group_winlose_statistic(**qdata):
     """
     """
     match_id = qdata.get("match_id")
-
     today = qdata.get("stock_date")
+
     if not today:
         today = get_today_date()
 
@@ -3455,6 +3455,7 @@ def get_match_group_winlose_statistic(**qdata):
         group_id = int(item["match_group"])
         if match_group_status_dct.get(group_id)>0:
             group_win_lose_list.append({
+	            "match_id":match_id,
                 "match_group":group_id,
                 "match_group_name":match_group_dct.get(group_id),
                 "today_fund":"{}".format(round(item["today_fund"],2)),
@@ -3502,11 +3503,16 @@ def get_user_markscore_list(**kwargs):
     """
     """
     today = kwargs.get("stock_date")
+    user_id = kwargs.get("user_id")
     if not today:
         today = get_today_date()
     qset = cm.UserMarkScore.objects.filter(stock_date=today)
     qdata = list(qset.values("score").annotate(cnt=Count("score")))
-
+    for item in qdata:
+        if item["user_id"] == user_id:
+            item["mark_status"] = 1
+        else:
+            item["mark_status"] = 0
     rst = {"total":qset.count(),"list":qdata}
     return rst
 
@@ -3519,3 +3525,48 @@ def check_user_markscore(**kwargs):
         return 1
     else:
         return 0
+
+
+def get_match_group_winlose_allday(**qdata):
+    """
+    """
+    match_id = qdata.get("match_id")
+    group_id = qdata.get("group_id")
+    today = qdata.get("stock_date")
+
+    if not today:
+        today = get_today_date()
+
+    match_group_dct = {}
+    matchGroup = cm.MatchGroup.objects.filter(match_id=match_id).order_by("-order")
+    for item in matchGroup:
+        match_group_dct[item.id] = item.name
+
+    prset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,match_group=group_id)
+
+    all_day = list(set(prset.values_list("stock_date",flat=True)))
+    for stock_date in all_day: 
+        group_win_lose_list = []
+        #今日总资产,总收益,平均收益
+        prdata = prset.values("match_group","stock_date").annotate(today_fund=Sum("today_fund"),
+            today_income=Sum("today_income"),cnt=Count("today_income")).order_by("match_group")
+
+        for item in prdata:
+            group_id = int(item["match_group"])
+            group_win_lose_list.append({
+                "stock_date":stock_date,
+                "match_group":group_id,
+                "match_group_name":match_group_dct.get(group_id),
+                "today_fund":"{}".format(round(item["today_fund"],2)),
+                "today_income":"{}%".format(round(item["today_income"]*100,2)),
+                "today_income_avg":"{}%".format(round(item["today_income"]/item["cnt"]*100,2)) if item["cnt"] else 0.0
+            })
+    #group_win_lose_list = sorted(group_win_lose_list,key=lambda x:x["match_group"],reverse=True)
+
+    prset = cm.PlayerRecord.get_db_model(match_id).objects.filter(match_id=match_id,stock_date=today)
+    #今日全部人均收益率
+    total = prset.aggregate(total=Sum("today_income")).get("total")
+    today_win_lose_avg = "{}%".format(round(total/prset.count()*100,2)) if prset.count()>0 else 0.0
+
+    rst = {"today_win_lose_avg":today_win_lose_avg,"group_win_lose_list":group_win_lose_list}
+    return rst

+ 1 - 0
src/weixin/urls_backstage.py

@@ -112,6 +112,7 @@ urlpatterns = [
     url(r'^v3/user/markscore$', views.UserMarkScoreView.as_view()),
     url(r'^v3/user/markscore/list$', views.UserMarkScoreListView.as_view()),
     url(r'^v3/user/markscore/check$', views.UserMarkScoreCheckView.as_view()),
+    url(r'^v3/match/group/winlose/allday$', views.MatchGroupWinloseAllDayView.as_view()),
     
 ]
 

+ 20 - 3
src/weixin/views.py

@@ -546,7 +546,7 @@ class DefendRankView(cv.AuthView):
             return cv.to_fail(e)
 
 
-class ChampionArticleListView(cv.AuthView):                                                    
+class ChampionArticleListView(cv.BaseView):                                                    
     def get(self, request):                                                        
         """#冠军心得(2.0小程序)                                                       
         """                                                                        
@@ -1636,11 +1636,14 @@ class UserMarkScoreView(cv.AuthView):
         """
         qdata = request.json
         now = datetime.datetime.now()
-        need_params = ["stock_date","score"]
+        need_params = ["score"]
         mse = ccf.check_params(*need_params,**qdata)
         if mse:
             raise ce.TipException(mse)
         try:
+            today = qdata.get("stock_date")
+            if not today:
+                today = get_today_date()
             vals["user_id"] = request.user.get("id")
             vals = ccf.get_need_params(*need_params,**qdata)
             rst = ctl.user_mark_score(**vals)
@@ -1650,12 +1653,13 @@ class UserMarkScoreView(cv.AuthView):
             return cv.to_fail(e)
 
 
-class UserMarkScoreListView(cv.BaseView):
+class UserMarkScoreListView(cv.AuthView):
     def get(self, request):
         """#获取分组盈亏统计量
         """
         qdata = request.json
         try:
+            qdata["user_id"] = request.user.get("id")
             rst = ctl.get_user_markscore_list(**qdata)
             return cv.to_suc(rst)
         except Exception as e:
@@ -1675,3 +1679,16 @@ class UserMarkScoreCheckView(cv.AuthView):
         except Exception as e:
             cv.tracefail()
             return cv.to_fail(e)
+
+
+class MatchGroupWinloseAllDayView(cv.BaseView):
+    def get(self, request):
+        """#获取分组盈亏统计量
+        """
+        qdata = request.json
+        try:
+            rst = ctl.get_match_group_winlose_allday(**qdata)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)