Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from django.db import models
- from django.contrib.auth.models import User
- # Create your models here.
- class Profile(models.Model):
- mobile_number = models.CharField(max_length=12, unique=True)
- user = models.OneToOneField(User, on_delete=models.CASCADE)
- class Organization(models.Model):
- name = models.CharField(max_length=255)
- unp = models.CharField(max_length=9, unique=True)
- class Car(models.Model):
- model = models.CharField(max_length=255)
- seats = models.IntegerField()
- number = models.CharField(max_length=9, unique=True)
- organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
- class Employee(models.Model):
- STATUS = (
- ('OP', 'Operator'),
- ('DR', 'Driver')
- )
- name = models.OneToOneField(User, on_delete=models.CASCADE)
- status = models.CharField(max_length=8, choices=STATUS)
- hire_date = models.DateField()
- hire_end_date = models.DateField(null=True)
- organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
- class OrganizationInvite(models.Model):
- code = models.CharField(unique=True, max_length=10)
- organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
- class OrganizationRoute(models.Model):
- start_place = models.CharField(max_length=255)
- final_place = models.CharField(max_length=255)
- start_time = models.TimeField()
- final_time = models.TimeField()
- price = models.IntegerField()
- organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
- class Schedule(models.Model):
- date = models.DateField()
- org_route = models.ForeignKey(OrganizationRoute, on_delete=models.CASCADE)
- driver = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='schedule_driver')
- car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name='schedule_car')
- from django.shortcuts import render, redirect
- from django.contrib.auth.forms import UserCreationForm, User
- from .forms import OrganizationForm
- from django.contrib.auth import authenticate, login, logout
- from .models import Profile, Organization, Schedule, Car, Employee, OrganizationInvite, OrganizationRoute
- from django.core.mail import send_mail, BadHeaderError
- from django.http import HttpResponse, HttpResponseRedirect
- import string, random
- import datetime
- # Create your views here.
- def signup(request):
- if request.method == 'POST':
- form = UserCreationForm(request.POST)
- if form.is_valid():
- form.save()
- username = form.cleaned_data.get('username')
- password = form.cleaned_data.get('password1')
- user = authenticate(username=username, password=password)
- login(request, user)
- return redirect('/accounts/profile')
- else:
- form = UserCreationForm()
- return render(request, 'accounts/signup.html', {'form': form})
- def get_user_profile(request, username):
- user = User.objects.get(username=username)
- return render(request, 'accounts/account.html', {'user': user})
- # user organization information
- def check_operator_status(user):
- employee = Employee.objects.get(name=user)
- if employee.status == 'OP':
- return True
- def get_organization(request):
- user = request.user
- organization = user.employee.organization
- if organization:
- employees = Employee.objects.filter(organization=organization)
- cars = Car.objects.filter(organization=organization)
- routes = OrganizationRoute.objects.filter(organization=organization)
- status = check_operator_status(user)
- return render(request, 'accounts/organization.html', {'employees': employees, 'cars': cars, 'routes': routes, 'status': status,})
- def new_organization(request):
- if request.method == 'POST':
- form = OrganizationForm(request.POST)
- if form.is_valid():
- form.save()
- name = form.cleaned_data.get('name')
- unp = form.cleaned_data.get('unp')
- return redirect('login')
- else:
- form = OrganizationForm()
- return render(request, 'accounts/new_org.html', {'form': form})
- # invite 'system'
- def send_invite(request):
- # code settings
- user = request.user
- organization = user.employee.organization
- code = ''.join(random.choice(string.ascii_uppercase + string.digits + string.ascii_lowercase) for _ in range(10))
- # email settings
- subject = 'Buster invite code'
- message = 'Hi! You invited to drivers company. If you not Roman - welcome to service. Invite url - http://localhost:8000/accounts/organization/{}'.format(code)
- from_message = request.POST.get('from_invite', '')
- if from_message and check_operator_status(user):
- try:
- send_mail(subject, message, 'invites@buster.io', [from_message])
- OrganizationInvite.objects.create(code=code, organization=organization)
- except BadHeaderError:
- return HttpResponse('invalid header')
- return redirect('/accounts/organization')
- else:
- return HttpResponse('Make sure all fields are entered and valid.')
- def join_invite(request, invite):
- user = request.user
- invite_code = OrganizationInvite.objects.get(code=invite)
- if invite_code:
- Employee.objects.create(
- name=user,
- status='DR',
- hire_date=datetime.date.today(),
- hire_end_date=datetime.date.today(),
- organization=invite_code.organization
- )
- invite_code.delete()
- from django.conf.urls import url, include, re_path
- from .views import signup, get_user_profile, get_organization, new_organization, send_invite, join_invite
- from django.contrib.auth.views import login, logout
- urlpatterns = [
- # url(r'^profile/$', home),
- url(r'^signup/$', signup, name='signup'),
- url(r'^logout/', logout, name='logout'),
- url(r'^login/$', login, {'template_name': 'accounts/login.html'}, name='login'),
- url(r'^profile/(?P<username>[a-zA-Z0-9]+)$', get_user_profile),
- url(r'^organization/$', get_organization, name='organization'),
- url(r'^organization/(?P<invite>[a-zA-Z0-9]+)$', join_invite, name='invite_join'),
- url(r'^organization/new/$', new_organization, name='new_org'),
- url(r'^organization/sho/$', send_invite, name='invite'),
- ]
- from django.forms import ModelForm
- from django.core.exceptions import ValidationError
- from .models import Organization, Car
- import requests, json
- # Your forms here.
- class OrganizationForm(ModelForm):
- def clean_unp(self):
- EGR_API = 'http://egr.gov.by/egrn/API.jsp?NM='
- unp = self.cleaned_data['unp']
- try:
- r = requests.get(EGR_API + unp)
- json_data = r.json()
- except json.decoder.JSONDecodeError:
- raise ValidationError('UNP is not register')
- if json_data[0]['ACT'] is False:
- raise ValidationError('UNP number in not active')
- return unp
- class Meta:
- model = Organization
- fields = ('name', 'unp', )
- class CarForm(ModelForm):
- class Meta:
- model = Car
- fields = ('model', 'seats', 'number')
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'drivers', # my apps
- ]
- MIDDLEWARE = [
- 'django.middleware.security.SecurityMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
- ]
- ROOT_URLCONF = 'buster.urls'
- TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [os.path.join(BASE_DIR, 'templates')],
- 'APP_DIRS': True,
- 'OPTIONS': {
- 'context_processors': [
- 'django.template.context_processors.debug',
- 'django.template.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'django.contrib.messages.context_processors.messages',
- ],
- },
- },
- ]
- WSGI_APPLICATION = 'buster.wsgi.application'
- # Database
- # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.postgresql_psycopg2',
- 'NAME': 'buster_db',
- 'USER': 'postgres',
- 'PASSWORD': 'qwerty',
- 'HOST': 'localhost',
- 'PORT': '5432',
- }
- }
- # Password validation
- # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
- AUTH_PASSWORD_VALIDATORS = [
- {
- 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
- },
- {
- 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
- },
- ]
- # Internationalization
- # https://docs.djangoproject.com/en/2.0/topics/i18n/
- LANGUAGE_CODE = 'ru-ru'
- TIME_ZONE = 'UTC'
- USE_I18N = True
- USE_L10N = True
- USE_TZ = True
- # Static files (CSS, JavaScript, Images)
- # https://docs.djangoproject.com/en/2.0/howto/static-files/
- STATIC_URL = '/static/'
- STATICFILES_DIRS = [
- os.path.join(BASE_DIR, 'static'),
- ]
- {
- "name": "optimizedhtml",
- "version": "3.0.0",
- "description": "OptimizedHTML - Start HTML Template",
- "main": "index.js",
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "WebDesign Master",
- "license": "ISC",
- "devDependencies": {
- "browser-sync": "^2.23.6",
- "del": "^3.0.0",
- "gulp": "^3.9.1",
- "gulp-autoprefixer": "^4.1.0",
- "gulp-cache": "^1.0.2",
- "gulp-clean-css": "^3.9.2",
- "gulp-concat": "^2.6.1",
- "gulp-imagemin": "^4.1.0",
- "gulp-notify": "^3.2.0",
- "gulp-rename": "^1.2.2",
- "gulp-rsync": "0.0.8",
- "gulp-sass": "^3.1.0",
- "gulp-uglify": "^3.0.0",
- "gulp-util": "^3.0.8",
- "vinyl-ftp": "^0.6.1"
- }
- }
- var gulp = require('gulp'),
- gutil = require('gulp-util' ),
- sass = require('gulp-sass'),
- browserSync = require('browser-sync'),
- concat = require('gulp-concat'),
- uglify = require('gulp-uglify'),
- cleanCSS = require('gulp-clean-css'),
- rename = require('gulp-rename'),
- del = require('del'),
- imagemin = require('gulp-imagemin'),
- cache = require('gulp-cache'),
- autoprefixer = require('gulp-autoprefixer'),
- ftp = require('vinyl-ftp'),
- notify = require("gulp-notify"),
- rsync = require('gulp-rsync');
- // Пользовательские скрипты проекта
- gulp.task('common-js', function() {
- return gulp.src([
- 'app/js/common.js',
- ])
- .pipe(concat('common.min.js'))
- .pipe(uglify())
- .pipe(gulp.dest('app/js'));
- });
- gulp.task('js', ['common-js'], function() {
- return gulp.src([
- 'app/libs/jquery/dist/jquery.min.js',
- 'app/js/common.min.js', // Всегда в конце
- ])
- .pipe(concat('scripts.min.js'))
- // .pipe(uglify()) // Минимизировать весь js (на выбор)
- .pipe(gulp.dest('app/js'))
- .pipe(browserSync.reload({stream: true}));
- });
- gulp.task('browser-sync', function() {
- browserSync({
- server: {
- baseDir: 'app'
- },
- notify: false,
- // tunnel: true,
- // tunnel: "projectmane", //Demonstration page: http://projectmane.localtunnel.me
- });
- });
- gulp.task('sass', function() {
- return gulp.src('app/sass/**/*.sass')
- .pipe(sass({outputStyle: 'expand'}).on("error", notify.onError()))
- .pipe(rename({suffix: '.min', prefix : ''}))
- .pipe(autoprefixer(['last 15 versions']))
- .pipe(cleanCSS()) // Опционально, закомментировать при отладке
- .pipe(gulp.dest('app/css'))
- .pipe(browserSync.reload({stream: true}));
- });
- gulp.task('watch', ['sass', 'js', 'browser-sync'], function() {
- gulp.watch('app/sass/**/*.sass', ['sass']);
- gulp.watch(['libs/**/*.js', 'app/js/common.js'], ['js']);
- gulp.watch('app/*.html', browserSync.reload);
- });
- gulp.task('imagemin', function() {
- return gulp.src('app/img/**/*')
- .pipe(cache(imagemin())) // Cache Images
- .pipe(gulp.dest('dist/img'));
- });
- gulp.task('build', ['removedist', 'imagemin', 'sass', 'js'], function() {
- var buildFiles = gulp.src([
- 'app/*.html',
- 'app/.htaccess',
- ]).pipe(gulp.dest('dist'));
- var buildCss = gulp.src([
- 'app/css/main.min.css',
- ]).pipe(gulp.dest('dist/css'));
- var buildJs = gulp.src([
- 'app/js/scripts.min.js',
- ]).pipe(gulp.dest('dist/js'));
- var buildFonts = gulp.src([
- 'app/fonts/**/*',
- ]).pipe(gulp.dest('dist/fonts'));
- });
- gulp.task('deploy', function() {
- var conn = ftp.create({
- host: 'hostname.com',
- user: 'username',
- password: 'userpassword',
- parallel: 10,
- log: gutil.log
- });
- var globs = [
- 'dist/**',
- 'dist/.htaccess',
- ];
- return gulp.src(globs, {buffer: false})
- .pipe(conn.dest('/path/to/folder/on/server'));
- });
- gulp.task('rsync', function() {
- return gulp.src('dist/**')
- .pipe(rsync({
- root: 'dist/',
- hostname: 'username@yousite.com',
- destination: 'yousite/public_html/',
- // include: ['*.htaccess'], // Скрытые файлы, которые необходимо включить в деплой
- recursive: true,
- archive: true,
- silent: false,
- compress: true
- }));
- });
- gulp.task('removedist', function() { return del.sync('dist'); });
- gulp.task('clearcache', function () { return cache.clearAll(); });
- gulp.task('default', ['watch']);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement