Advertisement
Guest User

Untitled

a guest
Mar 27th, 2018
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.91 KB | None | 0 0
  1. from django.db import models
  2. from django.contrib.auth.models import User
  3.  
  4. # Create your models here.
  5.  
  6. class Profile(models.Model):
  7. mobile_number = models.CharField(max_length=12, unique=True)
  8. user = models.OneToOneField(User, on_delete=models.CASCADE)
  9.  
  10. class Organization(models.Model):
  11. name = models.CharField(max_length=255)
  12. unp = models.CharField(max_length=9, unique=True)
  13.  
  14. class Car(models.Model):
  15. model = models.CharField(max_length=255)
  16. seats = models.IntegerField()
  17. number = models.CharField(max_length=9, unique=True)
  18. organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
  19.  
  20. class Employee(models.Model):
  21. STATUS = (
  22. ('OP', 'Operator'),
  23. ('DR', 'Driver')
  24. )
  25. name = models.OneToOneField(User, on_delete=models.CASCADE)
  26. status = models.CharField(max_length=8, choices=STATUS)
  27. hire_date = models.DateField()
  28. hire_end_date = models.DateField(null=True)
  29. organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
  30.  
  31. class OrganizationInvite(models.Model):
  32. code = models.CharField(unique=True, max_length=10)
  33. organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
  34.  
  35. class OrganizationRoute(models.Model):
  36. start_place = models.CharField(max_length=255)
  37. final_place = models.CharField(max_length=255)
  38. start_time = models.TimeField()
  39. final_time = models.TimeField()
  40. price = models.IntegerField()
  41. organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
  42.  
  43. class Schedule(models.Model):
  44. date = models.DateField()
  45. org_route = models.ForeignKey(OrganizationRoute, on_delete=models.CASCADE)
  46. driver = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='schedule_driver')
  47. car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name='schedule_car')
  48.  
  49. from django.shortcuts import render, redirect
  50. from django.contrib.auth.forms import UserCreationForm, User
  51. from .forms import OrganizationForm
  52. from django.contrib.auth import authenticate, login, logout
  53. from .models import Profile, Organization, Schedule, Car, Employee, OrganizationInvite, OrganizationRoute
  54. from django.core.mail import send_mail, BadHeaderError
  55. from django.http import HttpResponse, HttpResponseRedirect
  56.  
  57. import string, random
  58. import datetime
  59.  
  60. # Create your views here.
  61.  
  62. def signup(request):
  63. if request.method == 'POST':
  64. form = UserCreationForm(request.POST)
  65. if form.is_valid():
  66. form.save()
  67. username = form.cleaned_data.get('username')
  68. password = form.cleaned_data.get('password1')
  69. user = authenticate(username=username, password=password)
  70. login(request, user)
  71. return redirect('/accounts/profile')
  72. else:
  73. form = UserCreationForm()
  74. return render(request, 'accounts/signup.html', {'form': form})
  75.  
  76. def get_user_profile(request, username):
  77. user = User.objects.get(username=username)
  78. return render(request, 'accounts/account.html', {'user': user})
  79.  
  80. # user organization information
  81.  
  82. def check_operator_status(user):
  83. employee = Employee.objects.get(name=user)
  84. if employee.status == 'OP':
  85. return True
  86.  
  87. def get_organization(request):
  88. user = request.user
  89. organization = user.employee.organization
  90. if organization:
  91. employees = Employee.objects.filter(organization=organization)
  92. cars = Car.objects.filter(organization=organization)
  93. routes = OrganizationRoute.objects.filter(organization=organization)
  94. status = check_operator_status(user)
  95. return render(request, 'accounts/organization.html', {'employees': employees, 'cars': cars, 'routes': routes, 'status': status,})
  96.  
  97. def new_organization(request):
  98. if request.method == 'POST':
  99. form = OrganizationForm(request.POST)
  100. if form.is_valid():
  101. form.save()
  102. name = form.cleaned_data.get('name')
  103. unp = form.cleaned_data.get('unp')
  104. return redirect('login')
  105. else:
  106. form = OrganizationForm()
  107. return render(request, 'accounts/new_org.html', {'form': form})
  108.  
  109. # invite 'system'
  110. def send_invite(request):
  111. # code settings
  112. user = request.user
  113. organization = user.employee.organization
  114. code = ''.join(random.choice(string.ascii_uppercase + string.digits + string.ascii_lowercase) for _ in range(10))
  115.  
  116. # email settings
  117. subject = 'Buster invite code'
  118. message = 'Hi! You invited to drivers company. If you not Roman - welcome to service. Invite url - http://localhost:8000/accounts/organization/{}'.format(code)
  119. from_message = request.POST.get('from_invite', '')
  120.  
  121. if from_message and check_operator_status(user):
  122. try:
  123. send_mail(subject, message, 'invites@buster.io', [from_message])
  124. OrganizationInvite.objects.create(code=code, organization=organization)
  125. except BadHeaderError:
  126. return HttpResponse('invalid header')
  127. return redirect('/accounts/organization')
  128. else:
  129. return HttpResponse('Make sure all fields are entered and valid.')
  130.  
  131. def join_invite(request, invite):
  132. user = request.user
  133. invite_code = OrganizationInvite.objects.get(code=invite)
  134. if invite_code:
  135. Employee.objects.create(
  136. name=user,
  137. status='DR',
  138. hire_date=datetime.date.today(),
  139. hire_end_date=datetime.date.today(),
  140. organization=invite_code.organization
  141. )
  142. invite_code.delete()
  143.  
  144. from django.conf.urls import url, include, re_path
  145. from .views import signup, get_user_profile, get_organization, new_organization, send_invite, join_invite
  146. from django.contrib.auth.views import login, logout
  147.  
  148. urlpatterns = [
  149. # url(r'^profile/$', home),
  150. url(r'^signup/$', signup, name='signup'),
  151. url(r'^logout/', logout, name='logout'),
  152. url(r'^login/$', login, {'template_name': 'accounts/login.html'}, name='login'),
  153. url(r'^profile/(?P<username>[a-zA-Z0-9]+)$', get_user_profile),
  154. url(r'^organization/$', get_organization, name='organization'),
  155. url(r'^organization/(?P<invite>[a-zA-Z0-9]+)$', join_invite, name='invite_join'),
  156. url(r'^organization/new/$', new_organization, name='new_org'),
  157. url(r'^organization/sho/$', send_invite, name='invite'),
  158. ]
  159.  
  160. from django.forms import ModelForm
  161. from django.core.exceptions import ValidationError
  162. from .models import Organization, Car
  163.  
  164. import requests, json
  165.  
  166. # Your forms here.
  167. class OrganizationForm(ModelForm):
  168.  
  169. def clean_unp(self):
  170. EGR_API = 'http://egr.gov.by/egrn/API.jsp?NM='
  171. unp = self.cleaned_data['unp']
  172. try:
  173. r = requests.get(EGR_API + unp)
  174. json_data = r.json()
  175. except json.decoder.JSONDecodeError:
  176. raise ValidationError('UNP is not register')
  177.  
  178. if json_data[0]['ACT'] is False:
  179. raise ValidationError('UNP number in not active')
  180.  
  181. return unp
  182.  
  183. class Meta:
  184. model = Organization
  185. fields = ('name', 'unp', )
  186.  
  187. class CarForm(ModelForm):
  188.  
  189. class Meta:
  190. model = Car
  191. fields = ('model', 'seats', 'number')
  192.  
  193. INSTALLED_APPS = [
  194. 'django.contrib.admin',
  195. 'django.contrib.auth',
  196. 'django.contrib.contenttypes',
  197. 'django.contrib.sessions',
  198. 'django.contrib.messages',
  199. 'django.contrib.staticfiles',
  200. 'drivers', # my apps
  201. ]
  202.  
  203. MIDDLEWARE = [
  204. 'django.middleware.security.SecurityMiddleware',
  205. 'django.contrib.sessions.middleware.SessionMiddleware',
  206. 'django.middleware.common.CommonMiddleware',
  207. 'django.middleware.csrf.CsrfViewMiddleware',
  208. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  209. 'django.contrib.messages.middleware.MessageMiddleware',
  210. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  211. ]
  212.  
  213. ROOT_URLCONF = 'buster.urls'
  214.  
  215. TEMPLATES = [
  216. {
  217. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  218. 'DIRS': [os.path.join(BASE_DIR, 'templates')],
  219. 'APP_DIRS': True,
  220. 'OPTIONS': {
  221. 'context_processors': [
  222. 'django.template.context_processors.debug',
  223. 'django.template.context_processors.request',
  224. 'django.contrib.auth.context_processors.auth',
  225. 'django.contrib.messages.context_processors.messages',
  226. ],
  227. },
  228. },
  229. ]
  230.  
  231. WSGI_APPLICATION = 'buster.wsgi.application'
  232.  
  233.  
  234. # Database
  235. # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
  236.  
  237. DATABASES = {
  238. 'default': {
  239. 'ENGINE': 'django.db.backends.postgresql_psycopg2',
  240. 'NAME': 'buster_db',
  241. 'USER': 'postgres',
  242. 'PASSWORD': 'qwerty',
  243. 'HOST': 'localhost',
  244. 'PORT': '5432',
  245. }
  246. }
  247.  
  248.  
  249. # Password validation
  250. # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
  251.  
  252. AUTH_PASSWORD_VALIDATORS = [
  253. {
  254. 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
  255. },
  256. {
  257. 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
  258. },
  259. {
  260. 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
  261. },
  262. {
  263. 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
  264. },
  265. ]
  266.  
  267.  
  268. # Internationalization
  269. # https://docs.djangoproject.com/en/2.0/topics/i18n/
  270.  
  271. LANGUAGE_CODE = 'ru-ru'
  272.  
  273. TIME_ZONE = 'UTC'
  274.  
  275. USE_I18N = True
  276.  
  277. USE_L10N = True
  278.  
  279. USE_TZ = True
  280.  
  281.  
  282. # Static files (CSS, JavaScript, Images)
  283. # https://docs.djangoproject.com/en/2.0/howto/static-files/
  284.  
  285. STATIC_URL = '/static/'
  286. STATICFILES_DIRS = [
  287. os.path.join(BASE_DIR, 'static'),
  288. ]
  289.  
  290. {
  291. "name": "optimizedhtml",
  292. "version": "3.0.0",
  293. "description": "OptimizedHTML - Start HTML Template",
  294. "main": "index.js",
  295. "scripts": {
  296. "test": "echo \"Error: no test specified\" && exit 1"
  297. },
  298. "author": "WebDesign Master",
  299. "license": "ISC",
  300. "devDependencies": {
  301. "browser-sync": "^2.23.6",
  302. "del": "^3.0.0",
  303. "gulp": "^3.9.1",
  304. "gulp-autoprefixer": "^4.1.0",
  305. "gulp-cache": "^1.0.2",
  306. "gulp-clean-css": "^3.9.2",
  307. "gulp-concat": "^2.6.1",
  308. "gulp-imagemin": "^4.1.0",
  309. "gulp-notify": "^3.2.0",
  310. "gulp-rename": "^1.2.2",
  311. "gulp-rsync": "0.0.8",
  312. "gulp-sass": "^3.1.0",
  313. "gulp-uglify": "^3.0.0",
  314. "gulp-util": "^3.0.8",
  315. "vinyl-ftp": "^0.6.1"
  316. }
  317. }
  318.  
  319. var gulp = require('gulp'),
  320. gutil = require('gulp-util' ),
  321. sass = require('gulp-sass'),
  322. browserSync = require('browser-sync'),
  323. concat = require('gulp-concat'),
  324. uglify = require('gulp-uglify'),
  325. cleanCSS = require('gulp-clean-css'),
  326. rename = require('gulp-rename'),
  327. del = require('del'),
  328. imagemin = require('gulp-imagemin'),
  329. cache = require('gulp-cache'),
  330. autoprefixer = require('gulp-autoprefixer'),
  331. ftp = require('vinyl-ftp'),
  332. notify = require("gulp-notify"),
  333. rsync = require('gulp-rsync');
  334.  
  335. // Пользовательские скрипты проекта
  336.  
  337. gulp.task('common-js', function() {
  338. return gulp.src([
  339. 'app/js/common.js',
  340. ])
  341. .pipe(concat('common.min.js'))
  342. .pipe(uglify())
  343. .pipe(gulp.dest('app/js'));
  344. });
  345.  
  346. gulp.task('js', ['common-js'], function() {
  347. return gulp.src([
  348. 'app/libs/jquery/dist/jquery.min.js',
  349. 'app/js/common.min.js', // Всегда в конце
  350. ])
  351. .pipe(concat('scripts.min.js'))
  352. // .pipe(uglify()) // Минимизировать весь js (на выбор)
  353. .pipe(gulp.dest('app/js'))
  354. .pipe(browserSync.reload({stream: true}));
  355. });
  356.  
  357. gulp.task('browser-sync', function() {
  358. browserSync({
  359. server: {
  360. baseDir: 'app'
  361. },
  362. notify: false,
  363. // tunnel: true,
  364. // tunnel: "projectmane", //Demonstration page: http://projectmane.localtunnel.me
  365. });
  366. });
  367.  
  368. gulp.task('sass', function() {
  369. return gulp.src('app/sass/**/*.sass')
  370. .pipe(sass({outputStyle: 'expand'}).on("error", notify.onError()))
  371. .pipe(rename({suffix: '.min', prefix : ''}))
  372. .pipe(autoprefixer(['last 15 versions']))
  373. .pipe(cleanCSS()) // Опционально, закомментировать при отладке
  374. .pipe(gulp.dest('app/css'))
  375. .pipe(browserSync.reload({stream: true}));
  376. });
  377.  
  378. gulp.task('watch', ['sass', 'js', 'browser-sync'], function() {
  379. gulp.watch('app/sass/**/*.sass', ['sass']);
  380. gulp.watch(['libs/**/*.js', 'app/js/common.js'], ['js']);
  381. gulp.watch('app/*.html', browserSync.reload);
  382. });
  383.  
  384. gulp.task('imagemin', function() {
  385. return gulp.src('app/img/**/*')
  386. .pipe(cache(imagemin())) // Cache Images
  387. .pipe(gulp.dest('dist/img'));
  388. });
  389.  
  390. gulp.task('build', ['removedist', 'imagemin', 'sass', 'js'], function() {
  391.  
  392. var buildFiles = gulp.src([
  393. 'app/*.html',
  394. 'app/.htaccess',
  395. ]).pipe(gulp.dest('dist'));
  396.  
  397. var buildCss = gulp.src([
  398. 'app/css/main.min.css',
  399. ]).pipe(gulp.dest('dist/css'));
  400.  
  401. var buildJs = gulp.src([
  402. 'app/js/scripts.min.js',
  403. ]).pipe(gulp.dest('dist/js'));
  404.  
  405. var buildFonts = gulp.src([
  406. 'app/fonts/**/*',
  407. ]).pipe(gulp.dest('dist/fonts'));
  408.  
  409. });
  410.  
  411. gulp.task('deploy', function() {
  412.  
  413. var conn = ftp.create({
  414. host: 'hostname.com',
  415. user: 'username',
  416. password: 'userpassword',
  417. parallel: 10,
  418. log: gutil.log
  419. });
  420.  
  421. var globs = [
  422. 'dist/**',
  423. 'dist/.htaccess',
  424. ];
  425. return gulp.src(globs, {buffer: false})
  426. .pipe(conn.dest('/path/to/folder/on/server'));
  427.  
  428. });
  429.  
  430. gulp.task('rsync', function() {
  431. return gulp.src('dist/**')
  432. .pipe(rsync({
  433. root: 'dist/',
  434. hostname: 'username@yousite.com',
  435. destination: 'yousite/public_html/',
  436. // include: ['*.htaccess'], // Скрытые файлы, которые необходимо включить в деплой
  437. recursive: true,
  438. archive: true,
  439. silent: false,
  440. compress: true
  441. }));
  442. });
  443.  
  444. gulp.task('removedist', function() { return del.sync('dist'); });
  445. gulp.task('clearcache', function () { return cache.clearAll(); });
  446.  
  447. gulp.task('default', ['watch']);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement