· 9 years ago · Nov 28, 2016, 04:52 AM
1from __future__ import unicode_literals
2
3import datetime
4from mongoengine import Document, connect, EmbeddedDocument, fields, DynamicDocument
5from django.db import models
6
7# Create your models here.
8from mongoengine import signals
9
10connect('yourdb', alias='default')
11
12class GPS(EmbeddedDocument):
13 lat = fields.FloatField(null=False, required=True)
14 lon = fields.FloatField(null=False, required=True)
15
16
17class PPM(EmbeddedDocument):
18 time = fields.DateTimeField(default=datetime.datetime.now())
19 value = fields.IntField(null=False, required=True)
20
21 @classmethod
22 def pre_save(cls, sender, document, **kwargs):
23 document.time = datetime.datetime.now()
24
25
26signals.pre_save.connect(PPM.pre_save, sender=PPM)
27
28class BuyHistory(EmbeddedDocument):
29 time = fields.DateTimeField(default=datetime.datetime.now())
30 boxid = fields.StringField(max_length=128, null=False, required=True)
31 username = fields.StringField(max_length=128, null=False, required=True)
32 product = fields.StringField(max_length=128, null=False, required=True)
33 amount = fields.IntField()
34
35 @classmethod
36 def pre_save(cls, sender, document, **kwargs):
37 document.time = datetime.datetime.now()
38
39
40signals.pre_save.connect(BuyHistory.pre_save, sender=BuyHistory)
41
42class RecycleHistory(EmbeddedDocument):
43 time = fields.DateTimeField(default=datetime.datetime.now())
44 boxid = fields.StringField(max_length=128, null=False, required=True)
45 username = fields.StringField(max_length=128, null=False, required=True)
46 amount = fields.IntField()
47
48 @classmethod
49 def pre_save(cls, sender, document, **kwargs):
50 document.time = datetime.datetime.now()
51
52
53signals.pre_save.connect(RecycleHistory.pre_save, sender=RecycleHistory)
54
55class Box(Document):
56 boxid = fields.StringField(max_length=128, null=False, required=True)
57 gps = fields.EmbeddedDocumentField(GPS, required=True)
58 buy_history = fields.EmbeddedDocumentListField(BuyHistory, default='[]')
59 recycle_history = fields.EmbeddedDocumentListField(RecycleHistory, default='[]')
60 ppm_history = fields.EmbeddedDocumentListField(PPM, default='[]')
61
62class User(Document):
63 username = fields.StringField(max_length=128, null=False, required=True)
64 rfid = fields.StringField(max_length=32, null=False, required=True)
65 buy_history = fields.EmbeddedDocumentListField(BuyHistory)
66 recycle_history = fields.EmbeddedDocumentListField(RecycleHistory)
67
68from rest_framework_mongoengine import serializers
69from models import User, BuyHistory, Box, RecycleHistory, PPM
70
71class UserSerializer(serializers.DocumentSerializer):
72 class Meta:
73 model = User
74 fields = ('username', 'rfid', 'buy_history', 'recycle_history')
75
76
77class PPMSerializer(serializers.DocumentSerializer):
78 class Meta:
79 model = PPM
80 fields = ('time', 'value')
81
82
83class BuyHistorySerializer(serializers.EmbeddedDocumentSerializer):
84 class Meta:
85 model = BuyHistory
86 fields = ('time', 'boxid', 'username', 'product', 'amount')
87
88
89class RecycleHistorySerializer(serializers.EmbeddedDocumentSerializer):
90 class Meta:
91 model = RecycleHistory
92 fields = ('time', 'boxid', 'username', 'product', 'amount')
93
94
95class BoxSerializer(serializers.DocumentSerializer):
96
97 class Meta:
98 model = Box
99 fields = ('boxid', 'gps', 'buy_history', 'recycle_history', 'ppm_history')
100
101from models import User, Box
102from serializers import UserSerializer, BoxSerializer
103from rest_framework import generics
104# Create your views here.
105
106
107class BoxList(generics.ListCreateAPIView):
108 queryset = Box.objects.all()
109 serializer_class = BoxSerializer
110
111class UserList(generics.ListCreateAPIView):
112 queryset = User.objects.all()
113 serializer_class = UserSerializer
114
115
116class BoxDetail(generics.RetrieveUpdateDestroyAPIView):
117 queryset = Box.objects.all()
118 serializer_class = BoxSerializer(partial=True)
119
120
121class UserDetail(generics.RetrieveUpdateDestroyAPIView):
122 queryset = User.objects.all()
123 serializer_class = UserSerializer(partial=True)
124
125from django.conf.urls import url
126from django.contrib import admin
127from server_api import views
128
129urlpatterns = [
130 url(r'^admin/', admin.site.urls),
131 url(r'^box/$', views.BoxList.as_view()),
132 url(r'^box/(?P<pk>[0-9]+)$', views.BoxDetail.as_view()),
133 url(r'^user/$', views.UserList.as_view()),
134]
135
136import os
137
138# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
139BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
140
141
142# Quick-start development settings - unsuitable for production
143# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
144
145# SECURITY WARNING: keep the secret key used in production secret!
146SECRET_KEY = '08v0)(rn8ae8%v9li=he7n9)50q5^wre8srx*m#0_idvcu=jew'
147
148# SECURITY WARNING: don't run with debug turned on in production!
149DEBUG = True
150
151ALLOWED_HOSTS = []
152
153
154# Application definition
155
156INSTALLED_APPS = [
157 'django.contrib.admin',
158 'django.contrib.auth',
159 'django.contrib.contenttypes',
160 'django.contrib.sessions',
161 'django.contrib.messages',
162 'django.contrib.staticfiles',
163 'rest_framework',
164 'server_api.apps.ServerApiConfig'
165]
166
167MIDDLEWARE = [
168 'django.middleware.security.SecurityMiddleware',
169 'django.contrib.sessions.middleware.SessionMiddleware',
170 'django.middleware.common.CommonMiddleware',
171 'django.middleware.csrf.CsrfViewMiddleware',
172 'django.contrib.auth.middleware.AuthenticationMiddleware',
173 'django.contrib.messages.middleware.MessageMiddleware',
174 'django.middleware.clickjacking.XFrameOptionsMiddleware',
175]
176
177ROOT_URLCONF = 'pmi_pos_server_django.urls'
178
179TEMPLATES = [
180 {
181 'BACKEND': 'django.template.backends.django.DjangoTemplates',
182 'DIRS': [],
183 'APP_DIRS': True,
184 'OPTIONS': {
185 'context_processors': [
186 'django.template.context_processors.debug',
187 'django.template.context_processors.request',
188 'django.contrib.auth.context_processors.auth',
189 'django.contrib.messages.context_processors.messages',
190 ],
191 },
192 },
193]
194
195WSGI_APPLICATION = 'pmi_pos_server_django.wsgi.application'
196
197
198# Database
199# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
200
201DATABASES = {
202 'default': {
203 'ENGINE': 'django.db.backends.sqlite3',
204 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
205 }
206}
207
208
209# Password validation
210# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
211
212AUTH_PASSWORD_VALIDATORS = [
213 {
214 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
215 },
216 {
217 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
218 },
219 {
220 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
221 },
222 {
223 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
224 },
225]
226
227
228# Internationalization
229# https://docs.djangoproject.com/en/1.10/topics/i18n/
230
231LANGUAGE_CODE = 'en-us'
232
233TIME_ZONE = 'UTC'
234
235USE_I18N = True
236
237USE_L10N = True
238
239USE_TZ = True
240
241
242# Static files (CSS, JavaScript, Images)
243# https://docs.djangoproject.com/en/1.10/howto/static-files/
244
245STATIC_URL = '/static/'