diff --git a/.gitignore b/.gitignore index 6ae0a81..367c17d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ -mysite/mysite/settings.py -.idea/* \ No newline at end of file +.env +*.env +.idea/* +*.DS_STORE +venv/* +*.pyc +.project +.pydevproject +mysite/manage.py diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..b4e8602 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//mysite/datame/views.py=UTF-8 diff --git a/mysite/authentication/__init__.py b/mysite/authentication/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mysite/authentication/admin.py b/mysite/authentication/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/mysite/authentication/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/mysite/authentication/apps.py b/mysite/authentication/apps.py new file mode 100644 index 0000000..9635c9d --- /dev/null +++ b/mysite/authentication/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AuthenticationConfig(AppConfig): + name = 'authentication' diff --git a/mysite/authentication/migrations/__init__.py b/mysite/authentication/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mysite/authentication/models.py b/mysite/authentication/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/mysite/authentication/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/mysite/authentication/tests.py b/mysite/authentication/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/mysite/authentication/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/mysite/authentication/views.py b/mysite/authentication/views.py new file mode 100644 index 0000000..ebf59a7 --- /dev/null +++ b/mysite/authentication/views.py @@ -0,0 +1,10 @@ +from django.http import Http404 +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status + + +class HelloWorld(APIView): + def get(self, request, format=None): + saludo = 'Hola, ' + str(request.user) + '!' + return Response({'saludo':saludo}) \ No newline at end of file diff --git a/mysite/datame/__pycache__/views.cpython-36.pyc b/mysite/datame/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000..544e6b3 Binary files /dev/null and b/mysite/datame/__pycache__/views.cpython-36.pyc differ diff --git a/mysite/datame/admin.py b/mysite/datame/admin.py index 8c38f3f..fedaedc 100644 --- a/mysite/datame/admin.py +++ b/mysite/datame/admin.py @@ -1,3 +1,15 @@ from django.contrib import admin +from .models import * + # Register your models here. +admin.site.register(Apply) +admin.site.register(File) +admin.site.register(Offer) +admin.site.register(DataScientist) +admin.site.register(Contract) +admin.site.register(Bill) +admin.site.register(CV) +admin.site.register(Section) +admin.site.register(Item) +admin.site.register(Company) diff --git a/mysite/datame/migrations/0001_initial.py b/mysite/datame/migrations/0001_initial.py new file mode 100644 index 0000000..ebbe65e --- /dev/null +++ b/mysite/datame/migrations/0001_initial.py @@ -0,0 +1,158 @@ +# Generated by Django 2.1 on 2019-03-26 09:48 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Apply', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=80, verbose_name='Apply title')), + ('description', models.TextField(verbose_name='Apply description')), + ('date', models.DateTimeField(blank=True)), + ('status', models.CharField(choices=[('PE', 'PENDING'), ('AC', 'ACEPTED'), ('RE', 'REJECTED')], max_length=8, verbose_name='Status')), + ], + ), + migrations.CreateModel( + name='Bill', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('quantity', models.FloatField()), + ('tax', models.FloatField()), + ('total', models.FloatField()), + ('date', models.DateTimeField(default=django.utils.timezone.now)), + ('status', models.CharField(choices=[('PE', 'PENDING'), ('AC', 'ACCEPTED'), ('RE', 'REJECTED')], max_length=8, verbose_name='Status')), + ], + ), + migrations.CreateModel( + name='Company', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, verbose_name='Name')), + ('description', models.TextField(max_length=50, verbose_name='Description')), + ('nif', models.CharField(max_length=9, verbose_name='NIF')), + ('logo', models.CharField(max_length=30, verbose_name='Logo URL')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Contract', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date_created', models.DateTimeField(blank=True)), + ('limit_date', models.DateTimeField(blank=True)), + ('accepted_ds', models.BooleanField(default=None)), + ('accepted_company', models.BooleanField(default=True)), + ('expiration', models.IntegerField()), + ('apply', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='datame.Apply')), + ], + ), + migrations.CreateModel( + name='CV', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='DataScientist', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30, verbose_name='Name')), + ('surname', models.CharField(max_length=50, verbose_name='Surname')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='File', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=80, verbose_name='Name')), + ('path', models.CharField(max_length=200, verbose_name='Path')), + ('apply', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='datame.Apply')), + ], + ), + migrations.CreateModel( + name='Item', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, verbose_name='Name')), + ('description', models.CharField(max_length=100, verbose_name='Description')), + ('entity', models.CharField(max_length=50, verbose_name='Entity')), + ('date_start', models.DateTimeField(verbose_name='Start date')), + ('date_finish', models.DateTimeField(blank=True, null=True, verbose_name='End date')), + ], + ), + migrations.CreateModel( + name='Offer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=80, verbose_name='Offer title')), + ('description', models.TextField(verbose_name='Offer description')), + ('price_offered', models.FloatField(verbose_name='Price offered')), + ('currency', models.CharField(choices=[('0', '€'), ('1', '$'), ('2', '£')], max_length=1, verbose_name='Currency type')), + ('creation_date', models.DateTimeField(auto_now_add=True)), + ('limit_time', models.DateTimeField(blank=True)), + ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='datame.Company')), + ], + ), + migrations.CreateModel( + name='Section', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, verbose_name='Section name')), + ('cv', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sections', to='datame.CV')), + ], + ), + migrations.AddField( + model_name='item', + name='section', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='datame.Section'), + ), + migrations.AddField( + model_name='file', + name='offer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='datame.Offer'), + ), + migrations.AddField( + model_name='cv', + name='owner', + field=models.OneToOneField(default='', on_delete=django.db.models.deletion.CASCADE, to='datame.DataScientist'), + ), + migrations.AddField( + model_name='contract', + name='dataScientist', + field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='datame.DataScientist'), + ), + migrations.AddField( + model_name='contract', + name='offer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='datame.Offer'), + ), + migrations.AddField( + model_name='bill', + name='contract', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='datame.Contract'), + ), + migrations.AddField( + model_name='apply', + name='dataScientist', + field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='datame.DataScientist'), + ), + migrations.AddField( + model_name='apply', + name='offer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='datame.Offer'), + ), + ] diff --git a/mysite/datame/models.py b/mysite/datame/models.py index 71a8362..22dac78 100644 --- a/mysite/datame/models.py +++ b/mysite/datame/models.py @@ -1,3 +1,137 @@ from django.db import models +from django.contrib.auth.models import User +from django import forms +from django.utils import timezone +from django.template.defaultfilters import default # Create your models here. + +class Company(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + name = models.CharField('Name', max_length = 30) + description = models.TextField('Description', max_length = 50) + nif = models.CharField('NIF', max_length = 9) + logo = models.CharField('Logo URL', max_length = 30) + + def __str__(self): + return self.name + + +class DataScientist(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE) + name = models.CharField('Name', max_length = 30) + surname = models.CharField('Surname', max_length = 50) + + def __str__(self): + return self.name + + +class Offer(models.Model): + CURRENCY_CHOICES = ( + ('0', '€'), + ('1', '$'), + ('2', '£') + ) + + + title = models.CharField('Offer title', max_length = 80) + description = models.TextField('Offer description') + price_offered = models.FloatField('Price offered') + currency = models.CharField('Currency type',max_length = 1, choices = CURRENCY_CHOICES) + creation_date = models.DateTimeField(auto_now_add=True) + limit_time = models.DateTimeField(blank=True) + company = models.ForeignKey(Company, on_delete=models.CASCADE) + + def __str__(self): + return self.title + +class Apply(models.Model): + + STATUS_CHOICES = ( + ('PE', 'PENDING'), + ('AC', 'ACEPTED'), + ('RE', 'REJECTED') + ) + + title = models.CharField('Apply title', max_length = 80) + description = models.TextField('Apply description') + date = models.DateTimeField(blank=True) + status = models.CharField('Status',max_length = 8, choices = STATUS_CHOICES) + dataScientist = models.ForeignKey(DataScientist, default="",on_delete=models.CASCADE) + offer = models.ForeignKey(Offer, on_delete=models.CASCADE) + + + def __str__(self): + return self.title + +class Contract(models.Model): + + date_created = models.DateTimeField(blank=True) + limit_date = models.DateTimeField(blank=True) + accepted_ds = models.BooleanField(default = None) + accepted_company = models.BooleanField(default = True) + expiration = models.IntegerField() + dataScientist = models.ForeignKey(DataScientist, default="", on_delete=models.CASCADE) + offer = models.ForeignKey(Offer, on_delete=models.CASCADE) + apply = models.ForeignKey(Apply, null=True, blank=True, on_delete=models.CASCADE) + + def __str__(self): + cadena = self.offer.title + "//" + self.dataScientist.name + return cadena + +class Bill(models.Model): + + STATUS_CHOICES = ( + ('PE', 'PENDING'), + ('AC', 'ACCEPTED'), + ('RE', 'REJECTED') + ) + + quantity = models.FloatField() + tax = models.FloatField() + total = models.FloatField() + date = models.DateTimeField(default=timezone.now) + status = models.CharField('Status',max_length = 8, choices = STATUS_CHOICES) + contract = models.OneToOneField(Contract, null=True, on_delete=models.CASCADE) + #user_plan = models.ForeignKey(user_plan, on_delete=models.CASCADE) + + + def __str__(self): + return self.status + +class File(models.Model): + + name = models.CharField('Name', max_length = 80) + path = models.CharField('Path', max_length = 200) + apply = models.ForeignKey(Apply, on_delete=models.CASCADE) + offer = models.ForeignKey(Offer, on_delete=models.CASCADE) + + def __str__(self): + return self.name + +# Curriculum vitae +class CV(models.Model): + owner = models.OneToOneField('datame.DataScientist', default = "", on_delete = models.CASCADE) + + def __str__(self): + return self.owner.name + +# Sections of a curriculum +class Section(models.Model): + name = models.CharField("Section name", max_length = 50) + cv = models.ForeignKey("datame.CV", on_delete = models.CASCADE, related_name = 'sections') + + def __str__(self): + return self.name + +# Items of a section +class Item(models.Model): + name = models.CharField("Name", max_length=50) + section = models.ForeignKey("datame.Section", on_delete = models.CASCADE, related_name = 'items') + description = models.CharField("Description", max_length=100) + entity = models.CharField("Entity", max_length=50) + date_start = models.DateTimeField("Start date") + date_finish = models.DateTimeField("End date", blank=True, null=True) + + def __str__(self): + return self.name diff --git a/mysite/datame/views.py b/mysite/datame/views.py index 91ea44a..98d9e34 100644 --- a/mysite/datame/views.py +++ b/mysite/datame/views.py @@ -1,3 +1,295 @@ from django.shortcuts import render +import datetime, json, pytz, datetime +from .models import * +from django.views.decorators.csrf import csrf_exempt +from django.http import JsonResponse +from rest_framework.views import APIView +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework import status +from http.client import HTTPResponse +from django.core import serializers +from django.contrib.auth.models import User +from django.core.serializers.json import DjangoJSONEncoder +from django import forms +import ast + +class LazyEncoder(DjangoJSONEncoder): + def default(self, obj): + if isinstance(obj, Offer): + return str(obj) + return super().default(obj) # Create your views here. +@csrf_exempt +def Apply_view(request): + if request.method == "POST": + data = request.POST + title = data['title'] + description = data['description'] + date = datetime.datetime.utcnow() + dataScientist = DataScientist.objects.all().filter(user = request.user) + offer = data['offer'] + #Aqu� pretendo hacer una restriccion comparando si el usuario logueado est� dentro de la lista de usuarios que han hecho apply + #Sin embargo lo dejo comentado ya que no puedo probarlo + #usuariosAplicados = Apply_model.objects.all().select_related("dataScientist") + #if(not (dataScientist in usuariosAplicados)): + + new_apply = Apply.objects.create(title=title, description=description, status=Apply_model.STATUS_CHOICES[0][1], date=date, dataScientist = dataScientist, offer = offer) + + print('Sucessfully created new apply') + return JsonResponse({"message":"Successfully created new apply"}) + if request.method == "GET": + applys = [] + data = request.GET + filtro = data['filtro'] + #TODO Cuando se realice el login lo ideal es que no se le tenga que pasar la ID del principal, sino recuperarla mediante autentificacion + userId = data['userId'] + userRecuperado = User.objects.all().get(pk = userId) + dataScientistRecuperado = DataScientist.objects.all().get(user = userRecuperado) + if (filtro == 'PE'): + applys = Apply.objects.all().filter(dataScientist = dataScientistRecuperado,status ='PE').values() + if (filtro == 'AC'): + applys = Apply.objects.all().filter(dataScientist = dataScientistRecuperado,status ='AC').values() + if (filtro == 'RE'): + applys = Apply.objects.all().filter(dataScientist = dataScientistRecuperado,status ='RE').values() + return JsonResponse(list(applys), safe=False) + +@csrf_exempt +def Contract_view(request): + if request.method == "POST": + data = request.POST + limit_date = data['limit_date'] + accepted_ds = bool(data['accepted_ds']) + accepted_company = bool(data['accepted_company']) + expiration = data['expiration'] + dataScientistId = data['dataScientist'] + offerId = data['offer'] + date_created = datetime.datetime.utcnow() + dataScientist = DataScientist.objects.all().get(pk = dataScientistId) + offer = Offer.objects.all().get(pk = offerId) + + # Time management + split_time = limit_date.split(',') # Split by comma what was sent from client + split_time = list(map(int, split_time)) # Convert from list of string to list of integers + + if len(split_time) == 7: + date = datetime.datetime(split_time[0], split_time[1], + split_time[2], split_time[3], split_time[4], split_time[5], split_time[6], pytz.UTC) + + # Creation of new offer + new_contract = Contract.objects.create(date_created = date_created, limit_date=date, accepted_ds=accepted_ds, accepted_company=accepted_company, expiration=expiration, dataScientist = dataScientist, offer = offer) + + print('Sucessfully created contract') + return JsonResponse({"message":"Successfully created new contract"}) + +# Accept/Reject contract + +class Contract_actions_view(APIView): + def post(self, request, format=None): + try: + data = request.POST + contractid = data['contractid'] + + contract = Contract.objects.all().get(pk = contractid) + + logged_userid = request.user.id + + if logged_userid == contract.apply.dataScientist.id and contract.accepted_ds == None: + accepted_ds = data['accepted_ds'] + + contract.accepted_ds = accepted_ds + contract.save() + + message = "" + + if accepted_ds == 'False': + message = "Successfully rejected contract" + else: + message = "Successfully accepted contract" + + return JsonResponse({"message":message}) + except: + return JsonResponse({"message":"Sorry! Something went wrong..."}) + +@csrf_exempt +def File(request): + if request.method == "POST": + data = request.POST + name = data['name'] + path = data['path'] + apply = data['apply'] + offer = data['offer'] + + # Creation of new offer + new_file = File.objects.create(name=name, path=path, apply=apply, offer=offer) + + print('Sucessfully created File') + return JsonResponse({"message":"Successfully created new File"}) + + +@csrf_exempt +def Bill_view(request): + if request.method == "POST": + data = request.POST + quantity = data['quantity'] + tax = data['tax'] + total = data['total'] + date = datetime.datetime.utcnow() + status = data['status'] + contractId = data['contract'] + contract = Contract.objects.all().get(pk = contractId) + + # Creation of new offer + new_bill = Bill.objects.create(quantity=quantity, tax=tax, total=total, date=date, status=status, contract = contract) + + print('Sucessfully created new bill') + return JsonResponse({"message":"Successfully created new bill"}) + elif request.method == 'GET': + data = request.GET + idUsuario = data['idUsuario'] + userRecuperado = User.objects.all().get(pk = idUsuario) + dataScientistRecuperado = DataScientist.objects.all().get(user = userRecuperado) + bills = [] + contracts = [] + #bills = Bill.objects.all().values() + applies = Apply.objects.all().filter(dataScientist = dataScientistRecuperado).distinct() + for apply in applies: + try: + contract = Contract.objects.all().filter(apply=apply).distinct() + except: + contract = None + if (contract != None): + contracts.extend(list(contract)) + for contract in contracts: + try: + bill = Bill.objects.all().filter(contract_id = contract.id).values() + except: + bill = None + if (bill != None): + bills.extend(list(bill)) + return JsonResponse(bills, safe=False) + +@csrf_exempt +def Offer_view(request): + if request.method == "POST": + data = request.POST + title = data['title'] + description = data['description'] + price_offered = data['price_offered'] + currency = data['currency'] + limit_time = data['limit_time'] + + # Time management + split_time = limit_time.split(',') # Split by comma what was sent from client + split_time = list(map(int, split_time)) # Convert from list of string to list of integers + + if len(split_time) == 7: + date = datetime.datetime(split_time[0], split_time[1], + split_time[2], split_time[3], split_time[4], split_time[5], split_time[6], pytz.UTC) + + # Creation of new offer + new_offer = Offer.objects.create(title=title, description=description, + price_offered=float(price_offered), currency=currency, limit_time=date) + + print('La data que devuelve es: ' + str(data)) + print('Sucessfully created new offer') + return JsonResponse({"message":"Successfully created new offer"}) + if request.method == "GET": + ofertas = [] + date = datetime.datetime.utcnow() + ofertas = Offer.objects.all().filter(limit_time__gte = date).values() + + #else: + # company = Company_model.objects.get(user = request.user) + # if(company != None): + # ofertas = Company_model.objects.get(user = request.user).select_related("offers") + return JsonResponse(list(ofertas), safe=False) + + +class CV_view(APIView): + def get(self, request, format=None): + if request.method == "GET": + data = request.GET + + items = [] + #TODO Cuando se realice el login lo ideal es que no se le tenga que pasar la ID del principal, sino recuperarla mediante autentificacion + userId = data['userId'] + userRecuperado = User.objects.all().get(pk = userId) + dataScientistRecuperado = DataScientist.objects.all().get(user = userRecuperado) + + # Ver mi CV + if (dataScientistRecuperado != None): + curriculum = CV.objects.all().filter(owner = dataScientistRecuperado).first() + sections = Section.objects.all().filter(cv = curriculum) + for sec in sections: + sec_items = Item.objects.all().filter(section = sec) + data_sec_items = serializers.serialize('json', sec_items) + items.append(data_sec_items) + # Ver el CV de un Data scientist (como Company) + else: + #companyRecuperado = Company.objects.all().get(user = userRecuperado) + #if (companyRecuperado != None): + dataScientistId = data['dataScientistId'] + dataScientistUserRecuperado = User.objects.all().get(pk = dataScientistId) + scientist = DataScientist.objects.all().get(user = dataScientistUserRecuperado) + + curriculum = CV.objects.all().filter(owner = scientist) + sections = Section.objects.all().filter(cv = curriculum[0]) + for sec in sections: + sec_items = Item.objects.all().filter(section = sec) + items.append(sec_items) + + return JsonResponse(list(items), safe=False) + + def post(self, request, format=None): + try: + data = request.POST + user = DataScientist.objects.all().get(pk = request.user.datascientist.id) + + new_curriculum = CV.objects.create(owner=user) + + return JsonResponse({"message":"Successfully created new curriculum"}) + except: + return JsonResponse({"message":"Sorry! Something went wrong..."}) + +class Section_view(APIView): + def post(self, request, format=None): + try: + data = request.POST + secname = data['name'] + + logged_user = DataScientist.objects.all().get(pk = request.user.datascientist.id) + + cv = CV.objects.all().get(owner = logged_user) + + new_section = Section.objects.create(name = secname, cv = cv) + + return JsonResponse({"message":"Successfully created new section"}) + except: + return JsonResponse({"message":"Sorry! Something went wrong..."}) + + +class Item_view(APIView): + def post(self, request, format=None): + try: + data = request.POST + + secid = data['secid'] + section = Section.objects.all().get(pk = secid) + + logged_userid = request.user.id + + if logged_userid == section.cv.owner.user_id: + date_start = data['datestart'] + date_finish = data['datefinish'] + if date_start < date_finish: + itemname = data['name'] + description = data['description'] + entity = data['entity'] + + new_item = Item.objects.create(name = itemname, section = section, description = description, entity = entity, date_start = date_start, date_finish = date_finish) + + return JsonResponse({"message":"Successfully created new item"}) + except: + return JsonResponse({"message":"Sorry! Something went wrong..."}) diff --git a/mysite/manage.py b/mysite/manage.py index 390c767..a96ec91 100755 --- a/mysite/manage.py +++ b/mysite/manage.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import os import sys diff --git a/mysite/mysite/__pycache__/__init__.cpython-37.pyc b/mysite/mysite/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9e8d2ac..0000000 Binary files a/mysite/mysite/__pycache__/__init__.cpython-37.pyc and /dev/null differ diff --git a/mysite/mysite/__pycache__/settings.cpython-37.pyc b/mysite/mysite/__pycache__/settings.cpython-37.pyc deleted file mode 100644 index 28ec0a9..0000000 Binary files a/mysite/mysite/__pycache__/settings.cpython-37.pyc and /dev/null differ diff --git a/mysite/mysite/__pycache__/urls.cpython-37.pyc b/mysite/mysite/__pycache__/urls.cpython-37.pyc deleted file mode 100644 index 39cfa5f..0000000 Binary files a/mysite/mysite/__pycache__/urls.cpython-37.pyc and /dev/null differ diff --git a/mysite/mysite/__pycache__/wsgi.cpython-37.pyc b/mysite/mysite/__pycache__/wsgi.cpython-37.pyc deleted file mode 100644 index dfff436..0000000 Binary files a/mysite/mysite/__pycache__/wsgi.cpython-37.pyc and /dev/null differ diff --git a/mysite/mysite/settings.py b/mysite/mysite/settings.py new file mode 100644 index 0000000..6ee008a --- /dev/null +++ b/mysite/mysite/settings.py @@ -0,0 +1,173 @@ +""" +Django settings for mysite project. + +Generated by 'django-admin startproject' using Django 2.1.7. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.1/ref/settings/ +""" + +import os +from dotenv import load_dotenv +from datetime import timedelta + + +# Env variables=== +load_dotenv() + + + +ENGINE = os.getenv('ENGINE') +NAME = os.getenv('NAME') +USER = 'datameuser' +PASSWORD = os.getenv('PASSWORD') +HOST = os.getenv('HOST') +PORT = os.getenv('PORT') +#================== + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '*l&w360@^mz_041$q%=0h%f#rte8fn3st&*huu@rwtl!(9p3wl' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'datame', + 'rest_framework', + 'authentication', + 'corsheaders', + +] + +MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.common.CommonMiddleware', + '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', + +] + +MIDDLEWARE_CLASSES = ( + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.common.CommonMiddleware', +) + +ROOT_URLCONF = 'mysite.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + '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 = 'mysite.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': ENGINE, + 'NAME': NAME, + 'USER': USER, + 'PASSWORD': PASSWORD, + 'HOST': HOST, + 'PORT': PORT, + } +} + + + +# Password validation +# https://docs.djangoproject.com/en/2.1/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', + }, +] + +REST_FRAMEWORK = { + 'DEFAULT_PERMISSION_CLASSES': ( + 'rest_framework.permissions.IsAuthenticated', + ), + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', + ), +} +JWT_AUTH = { + 'JWT_ALLOW_REFRESH': True, + 'JWT_EXPIRATION_DELTA': timedelta(hours=1), + 'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=7), +} + +CORS_ORIGIN_ALLOW_ALL = True + +CORS_PREFLIGHT_MAX_AGE = 0 + +CORS_URLS_REGEX = r'^/api/v1/.*$' + +# Internationalization +# https://docs.djangoproject.com/en/2.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.1/howto/static-files/ + +STATIC_URL = '/static/' diff --git a/mysite/mysite/urls.py b/mysite/mysite/urls.py index af7aa86..3b41958 100644 --- a/mysite/mysite/urls.py +++ b/mysite/mysite/urls.py @@ -15,7 +15,23 @@ """ from django.contrib import admin from django.urls import path +from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token +from datame.views import * +from authentication import views urlpatterns = [ path('admin/', admin.site.urls), + path('api/v1/login', obtain_jwt_token), + path('api/v1/refresh',refresh_jwt_token), + path('api/v1/bill/', Bill_view,name='bill'), + path('api/v1/offer/', Offer_view ,name='offer'), + path('api/v1/apply/', Apply_view,name='apply'), + path('api/v1/contract/', Contract_view,name='contract'), + path('api/v1/contract_actions/', Contract_actions_view.as_view()), + path('api/v1/file/', File,name='file'), + path('api/v1/helloworld', views.HelloWorld.as_view()), + path('api/v1/cv/', CV_view.as_view()), + path('api/v1/section/', Section_view.as_view()), + path('api/v1/item/', Item_view.as_view()), + path('api/v1/company/', Company_view.as_view()), ] diff --git a/requirements.txt b/requirements.txt index ee918a2..37dc20b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,7 @@ -Django==2.1 +Django psycopg2 +djangorestframework +python-dotenv +djangorestframework_jwt +django-cors-headers +django-filter \ No newline at end of file