29
+    is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=_(u'是否为轮播商品'), db_index=True)
30
+    slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品轮播图片')
31
+
32
+    integral = models.IntegerField(_(u'integral'), default=99999, help_text=u'兑换所需积分')
33
+    fee = models.IntegerField(_(u'fee'), default=99999, help_text=u'兑换需额外支付金额,单位分')
34
+
35
+    minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'兑换最低会员级别')
36
+
37
+    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
38
+
39
+    class Meta:
40
+        verbose_name = _(u'会员商品信息')
41
+        verbose_name_plural = _(u'会员商品信息')
42
+
43
+    def __unicode__(self):
44
+        return unicode(self.pk)
45
+
46
+    @property
47
+    def image_path(self):
48
+        return upload_file_path(self.image)
49
+
50
+    @property
51
+    def image_url(self):
52
+        return upload_file_url(self.image)
53
+
54
+    @property
55
+    def slider_image_path(self):
56
+        return upload_file_path(self.slider_image)
57
+
58
+    @property
59
+    def slider_image_url(self):
60
+        return upload_file_url(self.slider_image)
61
+
62
+    @property
63
+    def data(self):
64
+        return {
65
+            'good_id': self.good_id,
66
+            'good_type': self.good_type,
67
+            'title': self.title,
68
+            'desc': self.desc,
69
+            'image': self.image_url,
70
+            'slider_image': self.slider_image_url,
71
+            'integral': self.integral,
72
+            'fee': self.fee,
73
+            'minlevel': self.minlevel,
74
+            'able': True,
75
+        }
76
+
77
+
78
+class RightInfo(BaseModelMixin):
79
+    right_id = ShortUUIDField(_(u'right_id'), max_length=32, blank=True, null=True, help_text=u'权益唯一标识', db_index=True, unique=True)
80
+
81
+    icon = models.ImageField(_(u'icon'), upload_to=upload_path, blank=True, null=True, help_text=u'权益图标')
82
+    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'权益名称')
83
+    subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'权益二级名称')
84
+    detail = RichTextField(_(u'detail'), blank=True, null=True, help_text=u'权益详情')
85
+
86
+    minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'权益最低会员级别')
87
+
88
+    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
89
+
90
+    class Meta:
91
+        verbose_name = _(u'会员权益信息')
92
+        verbose_name_plural = _(u'会员权益信息')
93
+
94
+    def __unicode__(self):
95
+        return unicode(self.pk)
96
+
97
+    @property
98
+    def icon_path(self):
99
+        return upload_file_path(self.icon)
100
+
101
+    @property
102
+    def icon_url(self):
103
+        return upload_file_url(self.icon)
104
+
105
+    @property
106
+    def data(self):
107
+        return {
108
+            'right_id': self.right_id,
109
+            'icon': self.icon_url,
110
+            'title': self.title,
111
+            'subtitle': self.subtitle,
112
+            'detail': self.detail,
113
+            'minlevel': self.minlevel,
114
+            "able": True,
115
+            "left_num": 3,
116
+            "left_tip": 3,
117
+        }
118
+
119
+
120
+class ShotTypeInfo(BaseModelMixin):
121
+    shot_type_id = ShortUUIDField(_(u'shot_type_id'), max_length=32, blank=True, null=True, help_text=u'镜头类型唯一标识', db_index=True, unique=True)
122
+    shot_type_name = models.CharField(_(u'shot_type_name'), max_length=255, blank=True, null=True, help_text=u'镜头类型名称')
123
+
124
+    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
125
+
126
+    class Meta:
127
+        verbose_name = _(u'镜头类型信息')
128
+        verbose_name_plural = _(u'镜头类型信息')
129
+
130
+    def __unicode__(self):
131
+        return unicode(self.pk)
132
+
133
+    @property
134
+    def shots(self):
135
+        models = ModelInfo.objects.filter(shot_type_id=self.shot_type_id, status=True)
136
+        return [model.shot_data for model in models]
137
+
138
+    @property
139
+    def data(self):
140
+        return {
141
+            'type_id': self.shot_type_id,
142
+            'type_name': self.shot_type_name,
143
+            'shots': self.shots,
144
+        }
145
+
146
+
147
+class MemberActivityInfo(BaseModelMixin):
148
+    title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
149
+    subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'活动二级名称')
150
+
151
+    date = models.DateField(_(u'date'), blank=True, null=True, help_text=u'活动时间')
152
+    location = models.CharField(_(u'location'), max_length=255, blank=True, null=True, help_text=u'活动地点')
153
+
154
+    image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'活动内容图片')
155
+
156
+    cover = models.ImageField(_(u'cover'), upload_to=upload_path, blank=True, null=True, help_text=u'活动列表图片')
157
+
158
+    is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=_(u'是否为轮播活动'), db_index=True)
159
+    slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, null=True, help_text=u'活动轮播图片')
160
+
161
+    content_rich_text = RichTextField(_(u'content_rich_text'), blank=True, null=True, help_text=u'活动描述')
162
+
163
+    share_img_link = models.CharField(_(u'share_img_link'), max_length=255, blank=True, null=True, help_text=u'活动图片分享')
164
+    share_h5_link = models.CharField(_(u'share_h5_link'), max_length=255, blank=True, null=True, help_text=u'活动H5分享')
165
+
166
+    position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
167
+
168
+    class Meta:
169
+        verbose_name = _(u'会员活动信息')
170
+        verbose_name_plural = _(u'会员活动信息')
171
+
172
+    def __unicode__(self):
173
+        return unicode(self.pk)
174
+
175
+    @property
176
+    def image_path(self):
177
+        return upload_file_path(self.image)
178
+
179
+    @property
180
+    def image_url(self):
181
+        return upload_file_url(self.image)
182
+
183
+    @property
184
+    def cover_path(self):
185
+        return upload_file_path(self.cover)
186
+
187
+    @property
188
+    def cover_url(self):
189
+        return upload_file_url(self.cover)
190
+
191
+    @property
192
+    def slider_image_path(self):
193
+        return upload_file_path(self.slider_image)
194
+
195
+    @property
196
+    def slider_image_url(self):
197
+        return upload_file_url(self.slider_image)
198
+
199
+    @property
200
+    def data(self):
201
+        return {
202
+            'id': self.pk,
203
+            'title': self.title,
204
+            'subtitle': self.subtitle,
205
+            'date': self.date,
206
+            'location': self.location,
207
+            'cover_url': self.cover_url,
208
+            'content_rich_text': self.content_rich_text,
209
+            'state': 0,
210
+            'is_signed': 0,
211
+        }

+ 7 - 0
member/tests.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.test import TestCase
5
+
6
+
7
+# Create your tests here.

+ 7 - 0
member/views.py

@@ -0,0 +1,7 @@
1
+# -*- coding: utf-8 -*-
2
+from __future__ import unicode_literals
3
+
4
+from django.shortcuts import render
5
+
6
+
7
+# Create your views here.

+ 1 - 1
pre/views.py

@@ -2,11 +2,11 @@
2 2
 
3 3
 from __future__ import division
4 4
 
5
+import xlrd
5 6
 from django.conf import settings
6 7
 from pysnippets.strsnippets import strip
7 8
 from TimeConvert import TimeConvert as tc
8 9
 
9
-import xlrd
10 10
 from mch.models import BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo
11 11
 from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo,
12 12
                               ConsumeProvinceSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo,

+ 4 - 4
requirements.txt

@@ -1,15 +1,15 @@
1 1
 CodeConvert==2.0.5
2
-MySQL-python==1.2.5
3 2
 Pillow==5.0.0
4 3
 StatusCode==1.0.0
5 4
 TimeConvert==1.5.0
6
-furl==2.0.0
5
+furl==2.1.0
7 6
 isoweek==1.3.3
8 7
 jsonfield==2.0.2
9 8
 mock==2.0.0
10 9
 monetary==1.0.3
11
-pysnippets==1.0.8
12
-qiniu==7.2.2
10
+mysqlclient==1.4.5
11
+pysnippets==1.1.2
12
+qiniu==7.2.6
13 13
 requests==2.21.0
14 14
 rlog==0.3
15 15
 rsa==3.4.2

+ 6 - 6
requirements_dj.txt

@@ -1,20 +1,20 @@
1
-Django==1.11.25
1
+Django==1.11.26
2 2
 django-admin==2.0.0
3
-django-cors-headers==2.4.0
3
+django-cors-headers==3.0.2
4 4
 django-curtail-uuid==1.0.4
5
-django-detect==1.0.8
5
+django-detect==1.0.16
6 6
 django-file-md5==1.0.3
7 7
 django-file-upload==1.1.1
8 8
 django-ip==1.0.2
9
-django-json-render==1.0.2
9
+django-json-render==1.0.3
10 10
 django-json-response==1.1.5
11 11
 django-logit==1.1.3
12 12
 django-mobi==0.1.7
13 13
 django-models-ext==1.1.9
14 14
 django-multidomain==1.1.4
15 15
 django-paginator2==1.1.3
16
-django-query==1.0.3
17
-django-redis-connector==1.0.1
16
+django-query==1.0.6
17
+django-redis-connector==1.0.3
18 18
 django-response==1.1.1
19 19
 django-rlog==1.0.7
20 20
 django-shortuuidfield==0.1.3

+ 1 - 1
requirements_pywe.txt

@@ -4,7 +4,7 @@ pywe-jssdk==1.1.0
4 4
 pywe-membercard==1.0.1
5 5
 pywe-miniapp==1.1.5
6 6
 pywe-oauth==1.0.7
7
-pywe-pay==1.0.12
7
+pywe-pay==1.0.13
8 8
 pywe-pay-notify==1.0.4
9 9
 pywe-response==1.0.1
10 10
 pywe-sign==1.1.0

+ 1 - 1
requirements_redis.txt

@@ -1,3 +1,3 @@
1
-hiredis==1.0.0
1
+hiredis==1.0.1
2 2
 redis==2.10.6
3 3
 redis-extensions==1.2.5

+ 0 - 0
simditor/__init__.py


+ 36 - 0
simditor/fields.py

@@ -0,0 +1,36 @@
1
+# -- coding: utf-8 --
2
+"""simditor fields."""
3
+from django import forms
4
+from django.db import models
5
+
6
+from .widgets import SimditorWidget
7
+
8
+
9
+class RichTextFormField(forms.fields.CharField):
10
+    """RichTextFormField."""
11
+
12
+    def __init__(self, *args, **kwargs):
13
+        kwargs.update(
14
+            {
15
+                'widget': SimditorWidget()
16
+            }
17
+        )
18
+        super(RichTextFormField, self).__init__(*args, **kwargs)
19
+
20
+
21
+class RichTextField(models.TextField):
22
+    """RichTextField."""
23
+
24
+    def __init__(self, *args, **kwargs):
25
+        super(RichTextField, self).__init__(*args, **kwargs)
26
+
27
+    def formfield(self, **kwargs):
28
+        defaults = {
29
+            'form_class': self._get_form_class()
30
+        }
31
+        defaults.update(kwargs)
32
+        return super(RichTextField, self).formfield(**defaults)
33
+
34
+    @staticmethod
35
+    def _get_form_class():
36
+        return RichTextFormField

+ 0 - 0
simditor/image/__init__.py


+ 11 - 0
simditor/image/dummy_backend.py

@@ -0,0 +1,11 @@
1
+# -- coding: utf-8 --
2
+"""simditor image pillow_backend."""
3
+from __future__ import absolute_import
4
+
5
+from simditor import utils
6
+
7
+
8
+def image_verify(file_object):
9
+    """image_verify."""
10
+    if not utils.is_valid_image_extension(file_object.name):
11
+        raise utils.NotAnImageException

+ 28 - 0
simditor/image/pillow_backend.py

@@ -0,0 +1,28 @@
1
+# -- coding: utf-8 --
2
+"""simditor image pillow_backend."""
3
+from __future__ import absolute_import
4
+
5
+import os
6
+from io import BytesIO
7
+
8
+from django.core.files.storage import default_storage
9
+from django.core.files.uploadedfile import InMemoryUploadedFile
10
+
11
+from simditor import utils
12
+
13
+
14
+try:
15
+    from PIL import Image, ImageOps
16
+except ImportError:
17
+    import Image
18
+    import ImageOps
19
+
20
+
21
+THUMBNAIL_SIZE = (75, 75)
22
+
23
+
24
+def image_verify(f):
25
+    try:
26
+        Image.open(f).verify()
27
+    except IOError:
28
+        raise utils.NotAnImageException

+ 16 - 0
simditor/image_processing.py

@@ -0,0 +1,16 @@
1
+# -- coding: utf-8 --
2
+"""simditor image_processing."""
3
+from __future__ import absolute_import
4
+
5
+from django.conf import settings
6
+
7
+
8
+def get_backend():
9
+    """Get backend."""
10
+    backend = getattr(settings, 'SIMDITOR_IMAGE_BACKEND', None)
11
+
12
+    if backend == 'pillow':
13
+        from simditor.image import pillow_backend as backend
14
+    else:
15
+        from simditor.image import dummy_backend as backend
16
+    return backend

BIN
simditor/static/simditor/fonts/icomoon.eot


+ 11 - 0
simditor/static/simditor/fonts/icomoon.svg

@@ -0,0 +1,11 @@
1
+<?xml version="1.0" standalone="no"?>
2
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+<svg xmlns="http://www.w3.org/2000/svg">
4
+<metadata>Generated by IcoMoon</metadata>
5
+<defs>
6
+<font id="icomoon" horiz-adv-x="512">
7
+<font-face units-per-em="512" ascent="480" descent="-32" />
8
+<missing-glyph horiz-adv-x="512" />
9
+<glyph unicode="&#x20;" d="" horiz-adv-x="256" />
10
+<glyph unicode="&#xe600;" d="M438.624 86.624l-73.376 73.376-45.248-45.248 73.376-73.376-73.376-73.376h192v192zM192 480h-192v-192l73.376 73.376 72.688-72.624 45.248 45.248-72.688 72.624zM192 114.752l-45.248 45.248-73.376-73.376-73.376 73.376v-192h192l-73.376 73.376zM512 480h-192l73.376-73.376-72.688-72.624 45.248-45.248 72.688 72.624 73.376-73.376z" />
11
+</font></defs></svg>

BIN
simditor/static/simditor/fonts/icomoon.ttf


BIN
simditor/static/simditor/fonts/icomoon.woff


+ 82 - 0
simditor/static/simditor/fonts/selection.json

@@ -0,0 +1,82 @@
1
+{
2
+	"IcoMoonType": "selection",
3
+	"icons": [
4
+		{
5
+			"icon": {
6
+				"paths": [
7
+					"M877.248 786.752l-146.752-146.752-90.496 90.496 146.752 146.752-146.752 146.752h384v-384zM384 0h-384v384l146.752-146.752 145.376 145.248 90.496-90.496-145.376-145.248zM384 730.496l-90.496-90.496-146.752 146.752-146.752-146.752v384h384l-146.752-146.752zM1024 0h-384l146.752 146.752-145.376 145.248 90.496 90.496 145.376-145.248 146.752 146.752z"
8
+				],
9
+				"tags": [
10
+					"fullscreen",
11
+					"expand"
12
+				],
13
+				"grid": 16,
14
+				"attrs": []
15
+			},
16
+			"attrs": [],
17
+			"properties": {
18
+				"id": 99,
19
+				"order": 2,
20
+				"prevSize": 16,
21
+				"code": 58880,
22
+				"name": "fullscreen"
23
+			},
24
+			"setIdx": 1,
25
+			"setId": 6,
26
+			"iconIdx": 99
27
+		}
28
+	],
29
+	"height": 1024,
30
+	"metadata": {
31
+		"name": "icomoon"
32
+	},
33
+	"preferences": {
34
+		"fontPref": {
35
+			"prefix": "icon-",
36
+			"metadata": {
37
+				"fontFamily": "icomoon",
38
+				"majorVersion": 1,
39
+				"minorVersion": 0
40
+			},
41
+			"showGlyphs": true,
42
+			"metrics": {
43
+				"emSize": 512,
44
+				"baseline": 6.25,
45
+				"whitespace": 50
46
+			},
47
+			"resetPoint": 58880,
48
+			"showQuickUse": true,
49
+			"quickUsageToken": false,
50
+			"showMetrics": false,
51
+			"showMetadata": false,
52
+			"autoHost": true,
53
+			"embed": false,
54
+			"ie7": false,
55
+			"showSelector": false,
56
+			"showVersion": true
57
+		},
58
+		"imagePref": {
59
+			"color": 0,
60
+			"height": 32,
61
+			"columns": 16,
62
+			"margin": 16,
63
+			"png": false,
64
+			"sprites": true,
65
+			"prefix": "icon-"
66
+		},
67
+		"historySize": 100,
68
+		"showCodes": true,
69
+		"gridSize": 16,
70
+		"showLiga": false,
71
+		"showGrid": true,
72
+		"showGlyphs": true,
73
+		"showQuickUse": true,
74
+		"search": "",
75
+		"quickUsageToken": {
76
+			"UntitledProject1": "ZWEwOTk2NTRmNjMyOGQ1MzAwZWFiYmJlODViMWMzZDcjMiMxNDA3NzM0MTA2IyMj"
77
+		},
78
+		"showQuickUse2": true,
79
+		"showSVGs": true,
80
+		"fontHostingName": false
81
+	}
82
+}

BIN
simditor/static/simditor/images/emoji/+1.png


BIN
simditor/static/simditor/images/emoji/-1.png


BIN
simditor/static/simditor/images/emoji/100.png


BIN
simditor/static/simditor/images/emoji/109.png


BIN
simditor/static/simditor/images/emoji/1234.png


BIN
simditor/static/simditor/images/emoji/a.png


BIN
simditor/static/simditor/images/emoji/ab.png


BIN
simditor/static/simditor/images/emoji/abc.png


BIN
simditor/static/simditor/images/emoji/abcd.png


BIN
simditor/static/simditor/images/emoji/accept.png


BIN
simditor/static/simditor/images/emoji/aerial_tramway.png


BIN
simditor/static/simditor/images/emoji/airplane.png


BIN
simditor/static/simditor/images/emoji/alarm_clock.png


BIN
simditor/static/simditor/images/emoji/alien.png


BIN
simditor/static/simditor/images/emoji/ambulance.png


BIN
simditor/static/simditor/images/emoji/anchor.png


BIN
simditor/static/simditor/images/emoji/angel.png


BIN
simditor/static/simditor/images/emoji/anger.png


BIN
simditor/static/simditor/images/emoji/angry.png


BIN
simditor/static/simditor/images/emoji/anguished.png


BIN
simditor/static/simditor/images/emoji/ant.png


BIN
simditor/static/simditor/images/emoji/apple.png


BIN
simditor/static/simditor/images/emoji/aquarius.png


BIN
simditor/static/simditor/images/emoji/aries.png


BIN
simditor/static/simditor/images/emoji/arrow_backward.png


BIN
simditor/static/simditor/images/emoji/arrow_double_down.png


BIN
simditor/static/simditor/images/emoji/arrow_double_up.png


BIN
simditor/static/simditor/images/emoji/arrow_down.png


BIN
simditor/static/simditor/images/emoji/arrow_down_small.png


BIN
simditor/static/simditor/images/emoji/arrow_forward.png


BIN
simditor/static/simditor/images/emoji/arrow_heading_down.png


BIN
simditor/static/simditor/images/emoji/arrow_heading_up.png


BIN
simditor/static/simditor/images/emoji/arrow_left.png


BIN
simditor/static/simditor/images/emoji/arrow_lower_left.png


BIN
simditor/static/simditor/images/emoji/arrow_lower_right.png


BIN
simditor/static/simditor/images/emoji/arrow_right.png


BIN
simditor/static/simditor/images/emoji/arrow_right_hook.png


BIN
simditor/static/simditor/images/emoji/arrow_up.png


BIN
simditor/static/simditor/images/emoji/arrow_up_down.png


BIN
simditor/static/simditor/images/emoji/arrow_up_small.png


BIN
simditor/static/simditor/images/emoji/arrow_upper_left.png


BIN
simditor/static/simditor/images/emoji/arrow_upper_right.png


BIN
simditor/static/simditor/images/emoji/arrows_clockwise.png


BIN
simditor/static/simditor/images/emoji/arrows_counterclockwise.png


BIN
simditor/static/simditor/images/emoji/art.png


BIN
simditor/static/simditor/images/emoji/articulated_lorry.png


BIN
simditor/static/simditor/images/emoji/astonished.png


BIN
simditor/static/simditor/images/emoji/atm.png


BIN
simditor/static/simditor/images/emoji/b.png


BIN
simditor/static/simditor/images/emoji/baby.png


BIN
simditor/static/simditor/images/emoji/baby_bottle.png


BIN
simditor/static/simditor/images/emoji/baby_chick.png


BIN
simditor/static/simditor/images/emoji/baby_symbol.png


BIN
simditor/static/simditor/images/emoji/baggage_claim.png


BIN
simditor/static/simditor/images/emoji/balloon.png


BIN
simditor/static/simditor/images/emoji/ballot_box_with_check.png


BIN
simditor/static/simditor/images/emoji/bamboo.png


BIN
simditor/static/simditor/images/emoji/banana.png


BIN
simditor/static/simditor/images/emoji/bangbang.png


BIN
simditor/static/simditor/images/emoji/bank.png


BIN
simditor/static/simditor/images/emoji/bar_chart.png


BIN
simditor/static/simditor/images/emoji/barber.png


BIN
simditor/static/simditor/images/emoji/baseball.png


BIN
simditor/static/simditor/images/emoji/basketball.png


BIN
simditor/static/simditor/images/emoji/bath.png


BIN
simditor/static/simditor/images/emoji/bathtub.png


BIN
simditor/static/simditor/images/emoji/battery.png


BIN
simditor/static/simditor/images/emoji/bear.png


BIN
simditor/static/simditor/images/emoji/beer.png


BIN
simditor/static/simditor/images/emoji/beers.png


BIN
simditor/static/simditor/images/emoji/beetle.png


BIN
simditor/static/simditor/images/emoji/beginner.png


BIN
simditor/static/simditor/images/emoji/bell.png


BIN
simditor/static/simditor/images/emoji/bento.png


BIN
simditor/static/simditor/images/emoji/bicyclist.png


BIN
simditor/static/simditor/images/emoji/bike.png


BIN
simditor/static/simditor/images/emoji/bikini.png


BIN
simditor/static/simditor/images/emoji/bird.png


BIN
simditor/static/simditor/images/emoji/birthday.png


BIN
simditor/static/simditor/images/emoji/black_circle.png


BIN
simditor/static/simditor/images/emoji/black_joker.png


BIN
simditor/static/simditor/images/emoji/black_nib.png


BIN
simditor/static/simditor/images/emoji/black_square.png


BIN
simditor/static/simditor/images/emoji/black_square_button.png


BIN
simditor/static/simditor/images/emoji/blossom.png


BIN
simditor/static/simditor/images/emoji/blowfish.png


BIN
simditor/static/simditor/images/emoji/blue_book.png


BIN
simditor/static/simditor/images/emoji/blue_car.png


BIN
simditor/static/simditor/images/emoji/blue_heart.png


BIN
simditor/static/simditor/images/emoji/blush.png


BIN
simditor/static/simditor/images/emoji/boar.png


BIN
simditor/static/simditor/images/emoji/boat.png


BIN
simditor/static/simditor/images/emoji/bomb.png


BIN
simditor/static/simditor/images/emoji/book.png


BIN
simditor/static/simditor/images/emoji/bookmark.png


BIN
simditor/static/simditor/images/emoji/bookmark_tabs.png


BIN
simditor/static/simditor/images/emoji/books.png


BIN
simditor/static/simditor/images/emoji/boom.png


BIN
simditor/static/simditor/images/emoji/boot.png


BIN
simditor/static/simditor/images/emoji/bouquet.png


BIN
simditor/static/simditor/images/emoji/bow.png


BIN
simditor/static/simditor/images/emoji/bowling.png


BIN
simditor/static/simditor/images/emoji/bowtie.png


BIN
simditor/static/simditor/images/emoji/boy.png


BIN
simditor/static/simditor/images/emoji/bread.png


BIN
simditor/static/simditor/images/emoji/bride_with_veil.png


BIN
simditor/static/simditor/images/emoji/bridge_at_night.png


BIN
simditor/static/simditor/images/emoji/briefcase.png


BIN
simditor/static/simditor/images/emoji/broken_heart.png


BIN
simditor/static/simditor/images/emoji/bug.png


BIN
simditor/static/simditor/images/emoji/bulb.png


BIN
simditor/static/simditor/images/emoji/bullettrain_front.png


BIN
simditor/static/simditor/images/emoji/bullettrain_side.png


BIN
simditor/static/simditor/images/emoji/bus.png


BIN
simditor/static/simditor/images/emoji/busstop.png


BIN
simditor/static/simditor/images/emoji/bust_in_silhouette.png


BIN
simditor/static/simditor/images/emoji/busts_in_silhouette.png


BIN
simditor/static/simditor/images/emoji/cactus.png


BIN
simditor/static/simditor/images/emoji/cake.png


BIN
simditor/static/simditor/images/emoji/calendar.png


BIN
simditor/static/simditor/images/emoji/calling.png


BIN
simditor/static/simditor/images/emoji/camel.png


BIN
simditor/static/simditor/images/emoji/camera.png


BIN
simditor/static/simditor/images/emoji/cancer.png


BIN
simditor/static/simditor/images/emoji/candy.png


BIN
simditor/static/simditor/images/emoji/capital_abcd.png


BIN
simditor/static/simditor/images/emoji/capricorn.png


BIN
simditor/static/simditor/images/emoji/car.png


BIN
simditor/static/simditor/images/emoji/card_index.png


BIN
simditor/static/simditor/images/emoji/carousel_horse.png


BIN
simditor/static/simditor/images/emoji/cat.png


BIN
simditor/static/simditor/images/emoji/cat2.png


BIN
simditor/static/simditor/images/emoji/cd.png


BIN
simditor/static/simditor/images/emoji/chart.png


BIN
simditor/static/simditor/images/emoji/chart_with_downwards_trend.png


BIN
simditor/static/simditor/images/emoji/chart_with_upwards_trend.png


BIN
simditor/static/simditor/images/emoji/checkered_flag.png


BIN
simditor/static/simditor/images/emoji/cherries.png


BIN
simditor/static/simditor/images/emoji/cherry_blossom.png


BIN
simditor/static/simditor/images/emoji/chestnut.png


BIN
simditor/static/simditor/images/emoji/chicken.png


BIN
simditor/static/simditor/images/emoji/children_crossing.png


BIN
simditor/static/simditor/images/emoji/chocolate_bar.png


BIN
simditor/static/simditor/images/emoji/christmas_tree.png


BIN
simditor/static/simditor/images/emoji/church.png


BIN
simditor/static/simditor/images/emoji/cinema.png


BIN
simditor/static/simditor/images/emoji/circus_tent.png


BIN
simditor/static/simditor/images/emoji/city_sunrise.png


BIN
simditor/static/simditor/images/emoji/city_sunset.png


BIN
simditor/static/simditor/images/emoji/cl.png


BIN
simditor/static/simditor/images/emoji/clap.png


BIN
simditor/static/simditor/images/emoji/clapper.png


BIN
simditor/static/simditor/images/emoji/clipboard.png


BIN
simditor/static/simditor/images/emoji/clock1.png


BIN
simditor/static/simditor/images/emoji/clock10.png


BIN
simditor/static/simditor/images/emoji/clock1030.png


BIN
simditor/static/simditor/images/emoji/clock11.png


BIN
simditor/static/simditor/images/emoji/clock1130.png


BIN
simditor/static/simditor/images/emoji/clock12.png


BIN
simditor/static/simditor/images/emoji/clock1230.png


BIN
simditor/static/simditor/images/emoji/clock130.png


BIN
simditor/static/simditor/images/emoji/clock2.png


BIN
simditor/static/simditor/images/emoji/clock230.png


BIN
simditor/static/simditor/images/emoji/clock3.png


BIN
simditor/static/simditor/images/emoji/clock330.png


BIN
simditor/static/simditor/images/emoji/clock4.png


BIN
simditor/static/simditor/images/emoji/clock430.png


BIN
simditor/static/simditor/images/emoji/clock5.png


BIN
simditor/static/simditor/images/emoji/clock530.png


BIN
simditor/static/simditor/images/emoji/clock6.png


BIN
simditor/static/simditor/images/emoji/clock630.png


BIN
simditor/static/simditor/images/emoji/clock7.png


BIN
simditor/static/simditor/images/emoji/clock730.png


BIN
simditor/static/simditor/images/emoji/clock8.png


BIN
simditor/static/simditor/images/emoji/clock830.png


BIN
simditor/static/simditor/images/emoji/clock9.png


BIN
simditor/static/simditor/images/emoji/clock930.png


BIN
simditor/static/simditor/images/emoji/closed_book.png


BIN
simditor/static/simditor/images/emoji/closed_lock_with_key.png


BIN
simditor/static/simditor/images/emoji/closed_umbrella.png


BIN
simditor/static/simditor/images/emoji/cloud.png


BIN
simditor/static/simditor/images/emoji/clubs.png


BIN
simditor/static/simditor/images/emoji/cn.png


BIN
simditor/static/simditor/images/emoji/cocktail.png


BIN
simditor/static/simditor/images/emoji/coffee.png


BIN
simditor/static/simditor/images/emoji/cold_sweat.png


BIN
simditor/static/simditor/images/emoji/collision.png


BIN
simditor/static/simditor/images/emoji/computer.png


BIN
simditor/static/simditor/images/emoji/confetti_ball.png


BIN
simditor/static/simditor/images/emoji/confounded.png


BIN
simditor/static/simditor/images/emoji/confused.png


BIN
simditor/static/simditor/images/emoji/congratulations.png


BIN
simditor/static/simditor/images/emoji/construction.png


BIN
simditor/static/simditor/images/emoji/construction_worker.png


BIN
simditor/static/simditor/images/emoji/convenience_store.png


BIN
simditor/static/simditor/images/emoji/cookie.png


BIN
simditor/static/simditor/images/emoji/cool.png


BIN
simditor/static/simditor/images/emoji/cop.png


BIN
simditor/static/simditor/images/emoji/copyright.png


BIN
simditor/static/simditor/images/emoji/corn.png


BIN
simditor/static/simditor/images/emoji/couple.png


BIN
simditor/static/simditor/images/emoji/couple_with_heart.png


BIN
simditor/static/simditor/images/emoji/couplekiss.png


BIN
simditor/static/simditor/images/emoji/cow.png


BIN
simditor/static/simditor/images/emoji/cow2.png


BIN
simditor/static/simditor/images/emoji/credit_card.png


BIN
simditor/static/simditor/images/emoji/crocodile.png


BIN
simditor/static/simditor/images/emoji/crossed_flags.png


BIN
simditor/static/simditor/images/emoji/crown.png


BIN
simditor/static/simditor/images/emoji/cry.png


BIN
simditor/static/simditor/images/emoji/crying_cat_face.png


BIN
simditor/static/simditor/images/emoji/crystal_ball.png


BIN
simditor/static/simditor/images/emoji/cupid.png


BIN
simditor/static/simditor/images/emoji/curly_loop.png


BIN
simditor/static/simditor/images/emoji/currency_exchange.png


BIN
simditor/static/simditor/images/emoji/curry.png


BIN
simditor/static/simditor/images/emoji/custard.png


BIN
simditor/static/simditor/images/emoji/customs.png


BIN
simditor/static/simditor/images/emoji/cyclone.png


BIN
simditor/static/simditor/images/emoji/dancer.png


BIN
simditor/static/simditor/images/emoji/dancers.png


BIN
simditor/static/simditor/images/emoji/dango.png


BIN
simditor/static/simditor/images/emoji/dart.png


BIN
simditor/static/simditor/images/emoji/dash.png


BIN
simditor/static/simditor/images/emoji/date.png


BIN
simditor/static/simditor/images/emoji/de.png


BIN
simditor/static/simditor/images/emoji/deciduous_tree.png


BIN
simditor/static/simditor/images/emoji/department_store.png


BIN
simditor/static/simditor/images/emoji/diamond_shape_with_a_dot_inside.png


BIN
simditor/static/simditor/images/emoji/diamonds.png


BIN
simditor/static/simditor/images/emoji/disappointed.png


BIN
simditor/static/simditor/images/emoji/dizzy.png


BIN
simditor/static/simditor/images/emoji/dizzy_face.png


BIN
simditor/static/simditor/images/emoji/do_not_litter.png


BIN
simditor/static/simditor/images/emoji/dog.png


BIN
simditor/static/simditor/images/emoji/dog2.png


BIN
simditor/static/simditor/images/emoji/dollar.png


BIN
simditor/static/simditor/images/emoji/dolls.png


BIN
simditor/static/simditor/images/emoji/dolphin.png


BIN
simditor/static/simditor/images/emoji/door.png


BIN
simditor/static/simditor/images/emoji/doughnut.png


BIN
simditor/static/simditor/images/emoji/dragon.png


BIN
simditor/static/simditor/images/emoji/dragon_face.png


BIN
simditor/static/simditor/images/emoji/dress.png


BIN
simditor/static/simditor/images/emoji/dromedary_camel.png


BIN
simditor/static/simditor/images/emoji/droplet.png


BIN
simditor/static/simditor/images/emoji/dvd.png


BIN
simditor/static/simditor/images/emoji/e-mail.png


BIN
simditor/static/simditor/images/emoji/ear.png


BIN
simditor/static/simditor/images/emoji/ear_of_rice.png


BIN
simditor/static/simditor/images/emoji/earth_africa.png


BIN
simditor/static/simditor/images/emoji/earth_americas.png


BIN
simditor/static/simditor/images/emoji/earth_asia.png


BIN
simditor/static/simditor/images/emoji/egg.png


BIN
simditor/static/simditor/images/emoji/eggplant.png


BIN
simditor/static/simditor/images/emoji/eight.png


BIN
simditor/static/simditor/images/emoji/eight_pointed_black_star.png


BIN
simditor/static/simditor/images/emoji/eight_spoked_asterisk.png


BIN
simditor/static/simditor/images/emoji/eightball.png


BIN
simditor/static/simditor/images/emoji/electric_plug.png


BIN
simditor/static/simditor/images/emoji/elephant.png


BIN
simditor/static/simditor/images/emoji/email.png


+ 0 - 0
simditor/static/simditor/images/emoji/emojify.css

@@ -0,0 +1 @@

Add some fields for Order · 32061504ff - Gogs: Go Git Service

Add some fields for Order

Brightcells 9 years ago
parent
commit
32061504ff
5 changed files with 61 additions and 18 deletions
  1. 1 0
      pay/admin.py
  2. 30 0
      pay/migrations/0008_auto_20170714_0759.py
  3. 6 0
      pay/models.py
  4. 22 18
      pay/views.py
  5. 2 0
      requirements.txt

+ 1 - 0
pay/admin.py

@@ -6,6 +6,7 @@ from pay.models import OrderInfo
6 6
 
7 7
 
8 8
 class OrderInfoAdmin(admin.ModelAdmin):
9
+    readonly_fields = ('order_id', 'prepay_id', 'transaction_id', 'unifiedorder_result', 'notify_msg')
9 10
     list_display = ('order_id', 'photo_type', 'photo_status', 'from_uid', 'to_uid', 'pay_status', 'paid_at', 'reback_status', 'reback_at', 'status', 'created_at', 'updated_at')
10 11
     list_filter = ('photo_type', 'photo_status', 'pay_status', 'reback_status', 'status')
11 12
 

+ 30 - 0
pay/migrations/0008_auto_20170714_0759.py

@@ -0,0 +1,30 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.3 on 2017-07-13 23:59
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('pay', '0007_orderinfo_unifiedorder_result'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='orderinfo',
17
+            name='notify_msg',
18
+            field=models.TextField(blank=True, help_text='\u56de\u8c03\u4fe1\u606f', null=True, verbose_name='notify_msg'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='orderinfo',
22
+            name='prepay_id',
23
+            field=models.CharField(blank=True, help_text='\u9884\u652f\u4ed8\u4ea4\u6613\u4f1a\u8bdd\u6807\u8bc6', max_length=255, null=True, verbose_name='prepay_id'),
24
+        ),
25
+        migrations.AddField(
26
+            model_name='orderinfo',
27
+            name='transaction_id',
28
+            field=models.CharField(blank=True, help_text='\u5fae\u4fe1\u8ba2\u5355\u53f7', max_length=255, null=True, verbose_name='transaction_id'),
29
+        ),
30
+    ]

+ 6 - 0
pay/models.py

@@ -53,6 +53,9 @@ class OrderInfo(CreateUpdateMixin):
53 53
 
54 54
     order_id = ShortUUIDField(_(u'order_id'), max_length=255, help_text=u'订单唯一标识', db_index=True)
55 55
 
56
+    prepay_id = models.CharField(_('prepay_id'), max_length=255, blank=True, null=True, help_text=u'预支付交易会话标识')
57
+    transaction_id = models.CharField(_('transaction_id'), max_length=255, blank=True, null=True, help_text=u'微信订单号')
58
+
56 59
     group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
57 60
     session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True)
58 61
     photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)
@@ -75,7 +78,10 @@ class OrderInfo(CreateUpdateMixin):
75 78
     reback_status = models.BooleanField(_(u'reback_status'), default=False, help_text=u'退款状态', db_index=True)
76 79
     reback_at = models.DateTimeField(_(u'reback_at'), blank=True, null=True, help_text=_(u'退款时间'))
77 80
 
81
+    # 微信统一下单
78 82
     unifiedorder_result = models.TextField(_(u'unifiedorder_result'), blank=True, null=True, help_text=_(u'统一下单结果'))
83
+    # 微信支付回调
84
+    notify_msg = models.TextField(_('notify_msg'), blank=True, null=True, help_text=u'回调信息')
79 85
 
80 86
     class Meta:
81 87
         verbose_name = _('orderinfo')

+ 22 - 18
pay/views.py

@@ -1,6 +1,5 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
-import xmltodict
4 3
 from django.conf import settings
5 4
 from django.db import transaction
6 5
 from django.shortcuts import HttpResponse
@@ -9,6 +8,8 @@ from paginator import pagination
9 8
 from pywe_exception import WeChatPayException
10 9
 from pywe_pay import WeChatPay
11 10
 from pywe_response import WXPAY_NOTIFY_FAIL, WXPAY_NOTIFY_SUCCESS
11
+from pywe_sign import check_signature
12
+from pywe_xml import xml_to_dict
12 13
 from TimeConvert import TimeConvert as tc
13 14
 
14 15
 from account.models import UserIncomeExpensesInfo, UserInfo
@@ -100,6 +101,9 @@ def wx_order_create_api(request):
100 101
         return response(OrderStatusCode.WX_UNIFIED_ORDER_FAIL)
101 102
 
102 103
     prepay_id = prepay_data.get('prepay_id', '')
104
+    order.prepay_id = prepay_id
105
+    order.save()
106
+
103 107
     if trade_type == 'JSAPI' or trade_type == 'MINIAPP':
104 108
         wxpay_params = wxpay.jsapi.get_jsapi_params(prepay_id)
105 109
     elif trade_type == 'APP':
@@ -204,7 +208,7 @@ def wx_order_query_api(request):
204 208
     # 订单查询
205 209
     query_data = wxpay.order.query(transaction_id, order_id)
206 210
     # 签名校验
207
-    if not wxpay.check_signature(query_data):
211
+    if not check_signature(query_data):
208 212
         return response(OrderStatusCode.SIGN_CHECK_FAIL)
209 213
 
210 214
     # 交易状态
@@ -262,36 +266,36 @@ def wx_order_detail_api(request):
262 266
 @transaction.atomic
263 267
 def wx_notify_url_api(request):
264 268
     """ 支付异步通知回调地址 """
265
-    try:
266
-        data = xmltodict.parse(request.body)['xml']
267
-    except xmltodict.ParsingInterrupted:
268
-        # 解析 XML 失败
269
+    data = xml_to_dict(request.body)
270
+    if isinstance(data, basestring):
269 271
         return HttpResponse(WXPAY_NOTIFY_FAIL)
270 272
 
271 273
     trade_type = data.get('trade_type', '')
272 274
 
273
-    # 根据 trade_type 获取 wechat 配置
274
-    wechat = WECHAT.get(trade_type, {})
275
-    # WeChatPay 初始化
276
-    wxpay = WeChatPay(wechat.get('appID'), wechat.get('apiKey'), wechat.get('mchID'))
277
-
278 275
     # 签名校验
279
-    if not wxpay.check_signature(data):
280
-        return response(OrderStatusCode.SIGN_CHECK_FAIL)
276
+    if not check_signature(data, settings.WECHAT.get(trade_type, {}).get('apiKey')):
277
+        return HttpResponse(WXPAY_NOTIFY_FAIL)
281 278
 
282
-    out_trade_no = data.get('out_trade_no', '')
279
+    # 通信标识
283 280
     return_code = data.get('return_code', '')
284
-    result_code = data.get('result_code', '')
285
-
286
-    if return_code != 'SUCCESS' or result_code != 'SUCCESS':
281
+    if return_code != 'SUCCESS':
287 282
         return HttpResponse(WXPAY_NOTIFY_FAIL)
288 283
 
284
+    out_trade_no = data.get('out_trade_no', '')
289 285
     try:
290 286
         order = OrderInfo.objects.get(order_id=out_trade_no)
291 287
     except OrderInfo.DoesNotExist:
292 288
         return response(OrderStatusCode.WX_ORDER_NOT_FOUND)
293 289
 
294
-    order_paid_success(order)
290
+    order.notify_msg = request.body
291
+    order.transaction_id = data.get('transaction_id', '')
292
+    order.save()
293
+
294
+    result_code = data.get('result_code', '')
295
+    if result_code == 'SUCCESS':
296
+        order_paid_success(order)
297
+    else:
298
+        order_paid_fail(order)
295 299
 
296 300
     return HttpResponse(WXPAY_NOTIFY_SUCCESS)
297 301
 

+ 2 - 0
requirements.txt

@@ -31,6 +31,8 @@ pywe-miniapp==1.0.0
31 31
 pywe-oauth==1.0.3
32 32
 pywe-pay==1.0.5
33 33
 pywe-response==1.0.1
34
+pywe-sign==1.0.5
35
+pywe-xml==1.0.0
34 36
 qiniu==7.1.4
35 37
 redis-extensions==1.0.50
36 38
 requests==2.18.1