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