diff --git a/.gitignore b/.gitignore index 6ae0a81..3ca35b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,10 @@ -mysite/mysite/settings.py -.idea/* \ No newline at end of file +.env +*.env +.idea/* +*.DS_STORE +venv/* +*.pyc +.project +.pydevproject +mysite/manage.py +.vscode 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/Procfile b/Procfile new file mode 100644 index 0000000..8377baa --- /dev/null +++ b/Procfile @@ -0,0 +1,2 @@ +release: sh -c 'cd mysite && python manage.py migrate' +web: sh -c 'cd mysite && gunicorn mysite.wsgi --log-file -' \ No newline at end of file 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/.models.py.swp b/mysite/datame/.models.py.swp new file mode 100644 index 0000000..2a77a10 Binary files /dev/null and b/mysite/datame/.models.py.swp differ diff --git a/mysite/datame/__pycache__/views.cpython-36.pyc b/mysite/datame/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000..33929f5 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..53f156b 100644 --- a/mysite/datame/admin.py +++ b/mysite/datame/admin.py @@ -1,3 +1,14 @@ from django.contrib import admin +from .models import * + # Register your models here. +admin.site.register(Apply) +admin.site.register(Offer) +admin.site.register(DataScientist) +admin.site.register(CV) +admin.site.register(Section) +admin.site.register(Item) +admin.site.register(Company) +admin.site.register(Message) +admin.site.register(Section_name) diff --git a/mysite/datame/migrations/0001_initial.py b/mysite/datame/migrations/0001_initial.py new file mode 100644 index 0000000..c37815e --- /dev/null +++ b/mysite/datame/migrations/0001_initial.py @@ -0,0 +1,130 @@ +# Generated by Django 2.1 on 2019-03-27 17:45 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +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(auto_now_add=True)), + ('status', models.CharField(choices=[('PE', 'PENDING'), ('AC', 'ACEPTED'), ('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.URLField(verbose_name='Logo URL')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + 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='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='Message', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=30, verbose_name='title')), + ('body', models.TextField(max_length=100, verbose_name='body')), + ('moment', models.DateTimeField(auto_now=True)), + ('receiver', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='receiver', to=settings.AUTH_USER_MODEL)), + ('sender', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='sender', to=settings.AUTH_USER_MODEL)), + ], + ), + 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)), + ('finished', models.BooleanField(default=False)), + ('files', models.URLField()), + ('contract', models.TextField(verbose_name='Contract')), + ('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')), + ('cv', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sections', to='datame.CV')), + ], + ), + migrations.CreateModel( + name='Section_name', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, verbose_name='Name')), + ], + ), + migrations.AddField( + model_name='section', + name='name', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='section_name', to='datame.Section_name'), + ), + 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='cv', + name='owner', + field=models.OneToOneField(default='', on_delete=django.db.models.deletion.CASCADE, to='datame.DataScientist'), + ), + 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/migrations/0002_auto_20190328_1213.py b/mysite/datame/migrations/0002_auto_20190328_1213.py new file mode 100644 index 0000000..9d40d13 --- /dev/null +++ b/mysite/datame/migrations/0002_auto_20190328_1213.py @@ -0,0 +1,25 @@ +# Generated by Django 2.1.7 on 2019-03-28 12:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('datame', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='message', + name='receiver', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='receiver', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='message', + name='sender', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sender', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/mysite/datame/migrations/0003_auto_20190328_1912.py b/mysite/datame/migrations/0003_auto_20190328_1912.py new file mode 100644 index 0000000..6866495 --- /dev/null +++ b/mysite/datame/migrations/0003_auto_20190328_1912.py @@ -0,0 +1,23 @@ +# Generated by Django 2.1.7 on 2019-03-28 19:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('datame', '0002_auto_20190328_1213'), + ] + + operations = [ + migrations.AlterField( + model_name='message', + name='body', + field=models.TextField(max_length=250, verbose_name='body'), + ), + migrations.AlterField( + model_name='message', + name='title', + field=models.CharField(max_length=100, verbose_name='title'), + ), + ] diff --git a/mysite/datame/models.py b/mysite/datame/models.py index 71a8362..ecf9249 100644 --- a/mysite/datame/models.py +++ b/mysite/datame/models.py @@ -1,3 +1,110 @@ from django.db import models +from django.contrib.auth.models import * +from django import forms +from django.utils import timezone +from django.template.defaultfilters import default # Create your models here. + +class Message(models.Model): + receiver = models.ForeignKey(User, related_name='receiver', on_delete=models.CASCADE) + sender = models.ForeignKey(User, related_name='sender', on_delete=models.CASCADE) + title = models.CharField('title', max_length = 100) + body = models.TextField('body', max_length = 250) + moment = models.DateTimeField(auto_now=True) + def __str__(self): + return self.title + + +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.URLField('Logo URL') + + 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) + finished = models.BooleanField(default=False) + files = models.URLField() + contract = models.TextField('Contract') + 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(auto_now_add=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 + +# Curriculum vitae +class CV(models.Model): + owner = models.OneToOneField('datame.DataScientist', default = "", on_delete = models.CASCADE) + + def __str__(self): + return self.owner.name + +class Section_name(models.Model): + name = models.CharField("Name", max_length=50) + + def __str__(self): + return self.name + +# Sections of a curriculum +class Section(models.Model): + name = models.ForeignKey("datame.Section_name", on_delete = models.CASCADE, related_name = 'section_name') + cv = models.ForeignKey("datame.CV", on_delete = models.CASCADE, related_name = 'sections') + + def __str__(self): + return self.name.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..019d397 100644 --- a/mysite/datame/views.py +++ b/mysite/datame/views.py @@ -1,3 +1,437 @@ 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.contrib.auth.models import Group +from django.core.serializers.json import DjangoJSONEncoder +from django import forms +from statsmodels.sandbox.distributions.sppatch import expect +from django.forms.models import model_to_dict +from django.db.models import Q +from django.contrib.auth.models import Group,Permission + +class LazyEncoder(DjangoJSONEncoder): + def default(self, obj): + if isinstance(obj, Offer): + return str(obj) + return super().default(obj) + + +class User_view(APIView): + def get(self, request, format=None): + try: + data = request.GET + user = request.user + users = [] + try: + users = User.objects.all().values('username') + print(users) + except: + print("There are no users") + + return JsonResponse(list(users), safe=False) + except: + return JsonResponse({"message":"Oops, something went wrong"}) + +class Message_view(APIView): + def post(self, request, format=None): + try: + data = request.POST + title = data['title'] + body = data['body'] + moment = datetime.datetime.utcnow() + #receiverId = User.objects.all().get(user = data['receiverId']) + username = data['username'] + receiver = User.objects.all().get(username = username) + senderId = request.user + print(senderId) + + new_message = Message.objects.create(title=title, body=body, moment=moment, receiver=receiver, sender=senderId) + + print('Sucessfully created new message') + return JsonResponse({"message":"Successfully created new message"}) + except Exception as e: + print(e) + return JsonResponse({"message":"Oops, something went wrong"}) + def get(self, request, format=None): + try: + data = request.GET + user = request.user + messages = [] + try: + messages = Message.objects.all().filter(receiver = user).values() + print(messages) + except: + print("You have 0 messages") + + return JsonResponse(list(messages), safe=False) + except: + return JsonResponse({"message":"Oops, something went wrong"}) + # Create your views here. + +class Apply_view(APIView): + def post(self, request, format=None): + try: + data = request.POST + title = data['title'] + description = data['description'] + date = datetime.datetime.utcnow() + user_logged = User.objects.all().get(pk = request.user.id) + if (not user_logged.groups.filter(name='DataScientist').exists()): + return JsonResponse({"message":"Only DataScientist can apply"}) + dataScientist = DataScientist.objects.all().get(user = request.user) + offerId = data['offerId'] + offer = Offer.objects.all().get(pk = offerId) + applysInOffer = Apply.objects.all().filter(offer = offer) + for apply in applysInOffer: + if(apply.dataScientist.id == dataScientist.id): + return JsonResponse({"message":"DataScientist already applied"}) + new_apply = Apply.objects.create(title=title, description=description, status='PE', date=date, dataScientist = dataScientist, offer = offer) + return JsonResponse({"message":"Successfully created new apply"}) + except: + return JsonResponse({"message":"Oops, something went wrong"}) + def get(self, request, format=None): + try: + user_logged = User.objects.all().get(pk = request.user.id) + if (user_logged.groups.filter(name='Company').exists()): + thisCompany = Company.objects.all().get(user = request.user) + offers = Offer.objects.all().filter(company = thisCompany).distinct() + 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 + + for offer in offers: + applysInOffer = Apply.objects.all().filter(offer = offer, status = 'PE').values() + applysInOffer_2 = [] + for i in applysInOffer: + i["DS_User_id"] = DataScientist.objects.filter(id=i["dataScientist_id"]).values_list()[0][1] + applysInOffer_2.append(i) + applys.extend(applysInOffer_2) + + return JsonResponse(list(applys), safe=False) + elif(user_logged.groups.filter(name='DataScientist').exists()): + dataScientistRecuperado = DataScientist.objects.all().get(user = request.user) + applys = [] + data = request.GET + #TODO Cuando se realice el login lo ideal es que no se le tenga que pasar la ID del principal, sino recuperarla mediante autentificacion + + applys = Apply.objects.all().filter(dataScientist = dataScientistRecuperado).values() + return JsonResponse(list(applys), safe=False) + except: + return JsonResponse({"message":"Oops, something went wrong"}) + +# Accept/Reject contract + +class AcceptApply_view(APIView): + def post(self, request, format=None): + try: + user_logged = User.objects.all().get(pk = request.user.id) + if (user_logged.groups.filter(name='Company').exists()): + company = Company.objects.all().get(user = user_logged) + data = request.POST + idApply = data['idApply'] + apply = Apply.objects.all().get(pk = idApply) + if(apply.offer.company == company): + if (apply.offer.finished == True): + res = JsonResponse({"message":"Offer has been already accepted"}) + else: + applysToUpdate = Apply.objects.all().filter(offer = apply.offer).update(status = 'RE') + apply.status = 'AC' + apply.save() + apply.offer.finished = True + apply.offer.save() + res = JsonResponse(model_to_dict(apply), safe=False) + else: + res = JsonResponse({"message":"The company doesnt own the offer"}) + else: + res = JsonResponse({"message":"Only companies can update an apply"}) + return res + except: + return JsonResponse({"message":"Oops, something went wrong"}) + +class Offer_view(APIView): + def get(self, request, format=None): + try: + data = request.GET + if data.get('search') != None: + date = datetime.datetime.utcnow() + ofertas = Offer.objects.filter(Q(title__contains = data['search']) | Q(description__contains = data['search']), limit_time__gte = date, finished=False).values() + return JsonResponse(list(ofertas), safe=False) + else: + ofertas = [] + try: + thisCompany = Company.objects.all().get(user = request.user) + # All offers instead only those who don't have an applicant + ofertas = Offer.objects.all().filter(company = thisCompany).values() + except: + date = datetime.datetime.utcnow() + thisDS = DataScientist.objects.all().get(user = request.user) + applies = Apply.objects.all().filter(dataScientist = thisDS) + user_applied_offers = [a.offer.id for a in applies] + # All offers whos time has not come yet + ofertas = Offer.objects.all().filter(limit_time__gte = date, finished=False).exclude(id__in=user_applied_offers).values() + return JsonResponse(list(ofertas), safe=False) + except Exception as e: + print(e) + return JsonResponse({"message":"Sorry! Something went wrong..."}) + def post(self, request, format=None): + try: + data = request.POST + title = data['title'] + description = data['description'] + price_offered = data['price_offered'] + currency = data['currency'] + limit_time = data['limit_time'] + contract = data['contract'] + files = data['files'] + thisCompany = Company.objects.all().get(user = request.user) + # Time management + date = limit_time.split(" ")[0].split("-") + hour = limit_time.split(" ")[1].split(":") + + limit_time = datetime.datetime(int(date[0]), int(date[1]), int(date[2]), int(hour[0]), int(hour[1]), 0, 0, pytz.UTC) + + + new_offer = Offer.objects.create(title=title, description=description, price_offered=float(price_offered), currency=currency, limit_time=limit_time, contract=contract, files=files, company = thisCompany) + + + print('La data que devuelve es: ' + str(data)) + print('Sucessfully created new offer') + return JsonResponse({"message":"Successfully created new offer"}) + except Exception as e: + return JsonResponse({"message":"Sorry! Something went wrong..."}) + + +class Company_view(APIView): + def get(self, request, format=None): + if request.method == "GET": + data = request.GET + logged_user = User.objects.all().get(pk = request.user.id) + print('logged_user: ' + str(logged_user)) + #company = [] + try: + companyRecuperada = Company.objects.all().get(user = logged_user) + thiscompany = Company.objects.all().filter(user = logged_user).values() + except: + companyId = data['companyId'] + companyUserRecuperado = User.objects.all().get(pk = companyId) + print('company user recuperada: ' + str(companyUserRecuperado)) + thiscompany = Company.objects.all().filter(user = companyUserRecuperado).values() + print('company recuperada: ' + str(thiscompany)) + + + return JsonResponse(list(thiscompany), safe=False) + + +class CV_view(APIView): + def get(self, request, format=None): + if request.method == "GET": + data = request.GET + secs = [] + logged_user = User.objects.all().get(pk = request.user.id) + try: + #Ver mi CV + dataScientistRecuperado = DataScientist.objects.all().get(user = logged_user) + curriculum = CV.objects.all().filter(owner = dataScientistRecuperado).first() + sections = Section.objects.all().filter(cv = curriculum) + for sec in sections: + items = [] + sec_items = Item.objects.all().filter(section = sec).values() + items.extend(sec_items) + secs.append({ + 'Section':str(sec), + 'Section_Id':str(sec.id), + 'Items':items + }); + + except: + #Ver CV de otro + dataScientistId = data['dataScientistId'] + dataScientistUserRecuperado = User.objects.all().get(pk = dataScientistId) + scientist = DataScientist.objects.all().get(user = dataScientistUserRecuperado) + curriculum = CV.objects.all().filter(owner = scientist).first() + sections = Section.objects.all().filter(cv = curriculum) + for sec in sections: + items = [] + sec_items = Item.objects.all().filter(section = sec).values() + items.extend(sec_items) + secs.append({ + 'Section':str(sec), + 'Section_Id':str(sec.id), + 'Items':items + }); + + return JsonResponse(list(secs), safe=False) + + def post(self, request, format=None): + try: + data = request.POST + logged_user = DataScientist.objects.all().get(pk = request.user.datascientist.id) + + new_curriculum = CV.objects.create(owner=logged_user) + + print('La data que devuelve es: ' + str(data)) + print('Sucessfully created new curriculum') + return JsonResponse({"message":"Successfully created new curriculum"}) + except: + return JsonResponse({"message":"Sorry! Something went wrong..."}) + +class Create_section_name(APIView): + def post(self, request, format=None): + try: + if request.user.is_superuser or request.user.is_staff: + data = request.POST + + new_section_name = Section_name.objects.create(name = data['name']) + + return JsonResponse({"message":"Successfully created new section name"}) + + else: + return JsonResponse({"message":"You do not have permission to perform this action"}) + except: + return JsonResponse({"message":"Sorry! Something went wrong..."}) + + +class Section_view(APIView): + def post(self, request, format=None): + try: + data = request.POST + sec = Section_name.objects.all().get(name = 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 = sec, cv = cv) + + return JsonResponse({"message":"Successfully created new section"}) + except: + return JsonResponse({"message":"Sorry! Something went wrong..."}) + +class Section_name_view(APIView): + def get(self, request, format=None): + if request.method == "GET": + data = request.GET + secnames = Section_name.objects.all().values() + return JsonResponse(list(secnames), safe=False) + + +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.datascientist.id + + if logged_userid == section.cv.owner.id: + + date_start = data['datestart'] + date_finish = request.POST.get('datefinish') + + if date_finish != None: + if date_start < date_finish: + + try: + item_tosave = Item.objects.all().get(pk = data['itemid']) + + item_tosave.name = data['name'] + item_tosave.description = data['description'] + item_tosave.entity = data['entity'] + item_tosave.date_start = date_start + item_tosave.date_finish = date_finish + + item_tosave.save() + + return JsonResponse({"message":"Successfully edited item"}) + except: + 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"}) + else: + return JsonResponse({"message":"Sorry, the starting date must be before the ending date!"}) + else: + try: + print('olawenas') + item_tosave = Item.objects.all().get(pk = data['itemid']) + + item_tosave.name = data['name'] + item_tosave.description = data['description'] + item_tosave.entity = data['entity'] + item_tosave.date_start = date_start + + item_tosave.save() + + return JsonResponse({"message":"Successfully edited item"}) + except: + print('olawenas') + 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) + + return JsonResponse({"message":"Successfully created new item"}) + except: + return JsonResponse({"message":"Sorry! Something went wrong..."}) + +def populate(request): + try: + company = Group.objects.create(name='Company') + dataScientist = Group.objects.create(name='DataScientist') + + admin = User.objects.create_user('admin', email='lennon@thebeatles.com', password='admin', is_staff=True) + permissions = Permission.objects.all() + for p in permissions: + admin.user_permissions.add(p) + data1 = User.objects.create_user(username='data1',email='data1@beatles.com',password='123456data1') + data1.groups.add(dataScientist) + + data2 = User.objects.create_user(username='data2',email='data2@beatles.com',password='123456data2') + data2.groups.add(dataScientist) + + company1 = User.objects.create_user(username='company1',email='company1@beatles.com',password='123456com1') + company1.groups.add(company) + + company2 = User.objects.create_user(username='company2',email='company2@beatles.com',password='123456com2') + company2.groups.add(company) + + dataScientist1 = DataScientist.objects.create(user = data1,name = "DataScientist 1",surname = "DS1") + dataScientist2 = DataScientist.objects.create(user = data2,name = "DataScientist 2",surname = "DS2") + + company01 = Company.objects.create(user = company1, name = 'Company 1', description = 'Description 1',nif = 'nif1', logo = 'www.company1.com') + company02 = Company.objects.create(user = company2, name = 'Company 2', description = 'Description 2',nif = 'nif2', logo = 'www.company2.com') + + return JsonResponse({'message': 'DB populated'}) + except: + return JsonResponse({'Error': 'DB already populated'}) + +class whoami(APIView): + def get(self, request, format=None): + try: + request.user.datascientist + return JsonResponse({'user_type': 'ds'}) + except: + try: + request.user.company + return JsonResponse({'user_type': 'com'}) + except: + return JsonResponse({'user_type': 'None'}) 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..b8dd12e --- /dev/null +++ b/mysite/mysite/settings.py @@ -0,0 +1,179 @@ +""" +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', +) + +BASEURL = 'https://api-datame.herokuapp.com' + +ROOT_URLCONF = 'mysite.urls' + +APIS = {} + +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/' + + +import django_heroku +django_heroku.settings(locals()) \ No newline at end of file diff --git a/mysite/mysite/urls.py b/mysite/mysite/urls.py index af7aa86..37202d3 100644 --- a/mysite/mysite/urls.py +++ b/mysite/mysite/urls.py @@ -15,7 +15,25 @@ """ 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/offer', Offer_view.as_view()), + path('api/v1/apply', Apply_view.as_view()), + path('api/v1/accept', AcceptApply_view.as_view(),name='accept apply'), + path('api/v1/helloworld', views.HelloWorld.as_view()), + path('api/v1/cv', CV_view.as_view()), + path('api/v1/section_names', Section_name_view.as_view()), + path('api/v1/message', Message_view.as_view(), name='mesagge'), + path('api/v1/section', Section_view.as_view()), + path('api/v1/section_name', Create_section_name.as_view()), + path('api/v1/item', Item_view.as_view()), + path('api/v1/company', Company_view.as_view()), + path('api/v1/populate', populate), + path('api/v1/whoami', whoami.as_view()), ] diff --git a/requirements.txt b/requirements.txt index ee918a2..b65545e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,13 @@ -Django==2.1 +Django psycopg2 +djangorestframework +python-dotenv +djangorestframework_jwt +django-cors-headers +django-filter +statsmodels +scipy + +#Heroku requirements +django-heroku +gunicorn \ No newline at end of file