From 828cda396dfd90fc8291892b39e7bc29250b1a8d Mon Sep 17 00:00:00 2001 From: Zamil Majdy <z.majdy1996@gmail.com> Date: Sun, 19 Mar 2017 21:48:43 +0700 Subject: [PATCH] [#140382397] #8 Add Accounts Model (Supervisor, Student, Company) --- core/admin.py | 6 ++- core/migrations/0001_initial.py | 54 ++++++++++++++++++++++++ core/models/accounts.py | 74 +++++++++++++++++++++++++++++++++ core/serializers/__init__.py | 0 core/serializers/accounts.py | 28 +++++++++++++ core/views/accounts.py | 33 +++++++++++++++ core/views/user.py | 25 ----------- kape/urls.py | 13 +++++- 8 files changed, 205 insertions(+), 28 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/models/accounts.py create mode 100644 core/serializers/__init__.py create mode 100644 core/serializers/accounts.py create mode 100644 core/views/accounts.py delete mode 100755 core/views/user.py diff --git a/core/admin.py b/core/admin.py index 8c38f3f3..f587859f 100755 --- a/core/admin.py +++ b/core/admin.py @@ -1,3 +1,7 @@ from django.contrib import admin -# Register your models here. +from core.models.accounts import Company, Supervisor, Student + +admin.site.register(Company) +admin.site.register(Student) +admin.site.register(Supervisor) \ No newline at end of file diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py new file mode 100644 index 00000000..43992e46 --- /dev/null +++ b/core/migrations/0001_initial.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-03-19 13:22 +from __future__ import unicode_literals + +import core.models.accounts +from django.conf import settings +import django.core.validators +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='Company', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('description', models.TextField()), + ('verified', models.BooleanField(default=False)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Student', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('npm', models.IntegerField(unique=True, validators=[django.core.validators.MinValueValidator(100000000), django.core.validators.MaxValueValidator(9999999999L)])), + ('resume', models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_file_path)), + ('phone_number', models.CharField(blank=True, db_index=True, max_length=100)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Supervisor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('nip', models.IntegerField(unique=True, validators=[django.core.validators.MinValueValidator(100000000), django.core.validators.MaxValueValidator(9999999999L)])), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/core/models/accounts.py b/core/models/accounts.py new file mode 100644 index 00000000..b911474b --- /dev/null +++ b/core/models/accounts.py @@ -0,0 +1,74 @@ +import os +import uuid + +from django.db import models +from django.contrib.auth.models import User +from django.core.validators import MinValueValidator, MaxValueValidator + + +def get_file_path(instance, filename): + extension = filename.split('.')[-1].lower() + filename = "%s.%s" % (uuid.uuid4(), extension) + return os.path.join("student-resume/", filename) + + +def get_display_name(user, full_name=False): + """ + Return a display name that always works like "Benoit J." + """ + if user.first_name and user.last_name: + if full_name: + last = user.last_name.title() + else: + last = user.last_name[:1].upper() + "." + name = user.first_name.title() + " " + last + elif user.first_name: + name = user.first_name.title() + elif user.last_name: + name = user.last_name.title() + else: + name = user.username + + return name.strip() + + +class Student(models.Model): + """ + A user subclass + """ + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + user = models.OneToOneField(User) + npm = models.IntegerField(validators=[MinValueValidator(100000000), MaxValueValidator(9999999999)], unique=True) + resume = models.FileField(upload_to=get_file_path, null=True, blank=True) + phone_number = models.CharField(max_length=100, blank=True, db_index=True) + + def __unicode__(self): + return u"Student {}".format(get_display_name(self.user)) + + +class Company(models.Model): + """ + A user subclass + """ + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + user = models.OneToOneField(User) + description = models.TextField() + verified = models.BooleanField(default=False) + + def __unicode__(self): + return u"Company {}".format(get_display_name(self.user)) + + +class Supervisor(models.Model): + """ + A user subclass + """ + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + user = models.OneToOneField(User) + nip = models.IntegerField(validators=[MinValueValidator(100000000), MaxValueValidator(9999999999)], unique=True) + + def __unicode__(self): + return u"Supervisor {}".format(get_display_name(self.user)) diff --git a/core/serializers/__init__.py b/core/serializers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/core/serializers/accounts.py b/core/serializers/accounts.py new file mode 100644 index 00000000..ad3f9aea --- /dev/null +++ b/core/serializers/accounts.py @@ -0,0 +1,28 @@ +from django.contrib.auth.models import User +from rest_framework import serializers + +from core.models.accounts import Supervisor, Company, Student + + +class UserSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = User + fields = ('url', 'username', 'email', 'is_staff') + + +class StudentSerializer(serializers.ModelSerializer): + class Meta: + model = Student + fields = '__all__' + + +class CompanySerializer(serializers.ModelSerializer): + class Meta: + model = Company + fields = '__all__' + + +class SupervisorSerializer(serializers.ModelSerializer): + class Meta: + model = Supervisor + fields = '__all__' \ No newline at end of file diff --git a/core/views/accounts.py b/core/views/accounts.py new file mode 100644 index 00000000..33bb4bb2 --- /dev/null +++ b/core/views/accounts.py @@ -0,0 +1,33 @@ +from django.contrib.auth.models import User +from rest_framework import viewsets +from rest_framework.decorators import list_route +from rest_framework.response import Response + +from core.models.accounts import Student, Company, Supervisor +from core.serializers.accounts import UserSerializer, StudentSerializer, CompanySerializer, SupervisorSerializer + + +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer + + @list_route(methods=['get']) + def me(self, request): + user = self.request.user + serializer = UserSerializer(user, context={"request": request}) + return Response(serializer.data) + + +class StudentViewSet(viewsets.ModelViewSet): + queryset = Student.objects.all() + serializer_class = StudentSerializer + + +class CompanyViewSet(viewsets.ModelViewSet): + queryset = Company.objects.all() + serializer_class = CompanySerializer + + +class SupervisorViewSet(viewsets.ModelViewSet): + queryset = Supervisor.objects.all() + serializer_class = SupervisorSerializer diff --git a/core/views/user.py b/core/views/user.py deleted file mode 100755 index e7342905..00000000 --- a/core/views/user.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.contrib.auth.models import User -from rest_framework import serializers, viewsets -from rest_framework.decorators import list_route -from rest_framework.response import Response - - -# Serializers define the API representation. -class UserSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = User - fields = ('url', 'username', 'email', 'is_staff') - - -# ViewSets define the view behavior. -class UserViewSet(viewsets.ModelViewSet): - queryset = User.objects.all() - serializer_class = UserSerializer - - @list_route(methods=['get']) - def me(self, request): - user = self.request.user - serializer = UserSerializer(user, context={"request": request}) - return Response(serializer.data) - - diff --git a/kape/urls.py b/kape/urls.py index 5a8171eb..eb420a54 100755 --- a/kape/urls.py +++ b/kape/urls.py @@ -13,23 +13,32 @@ Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ +from django.conf import settings from django.conf.urls import include from django.conf.urls import url +from django.conf.urls.static import static from django.contrib import admin from rest_framework import routers from rest_framework_swagger.views import get_swagger_view from core import apps -from core.views.user import UserViewSet +from core.views.accounts import StudentViewSet, CompanyViewSet, SupervisorViewSet, UserViewSet schema_view = get_swagger_view() router = routers.DefaultRouter() router.register(r'users', UserViewSet) +router.register(r'students', StudentViewSet) +router.register(r'companies', CompanyViewSet) +router.register(r'supervisors', SupervisorViewSet) -urlpatterns = [ +urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + +urlpatterns += [ url(r'^api/api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^api$', schema_view), url(r"^api/", include(router.urls)), url(r'^admin/', admin.site.urls), url(r'', apps.index, name="index"), ] + + -- GitLab