import os import uuid from datetime import date from django.utils import timezone from django.contrib.auth.models import User from django.core.validators import MinValueValidator, MaxValueValidator, RegexValidator, FileExtensionValidator from django.db import models from core.lib.validators import validate_document_file_extension, validate_image_file_extension, validate_npm, validate_student_gpa def get_student_resume_file_path(instance, filename): extension = filename.split('.')[-1].lower() filename = "%s.%s" % (uuid.uuid4(), extension) return os.path.join("student-resume/", filename) def get_student_photo_file_path(instance, filename): extension = filename.split('.')[-1].lower() filename = "%s.%s" % (uuid.uuid4(), extension) return os.path.join("student-photo/", filename) def get_company_logo_file_path(instance, filename): extension = filename.split('.')[-1].lower() filename = "%s.%s" % (uuid.uuid4(), extension) return os.path.join("company-logo/", filename) def get_current_age(born): today = date.today() return today.year - born.year - ((today.month, today.day) < (born.month, born.day)) def get_student_ui_ux_portofolio_file_path(instance, filename): extension = filename.split('.')[-1].lower() filename = "%s.%s" % (uuid.uuid4(), extension) return os.path.join("student-ui-ux-portofolio/", 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() def get_student_sertifikat_file_path(instance, filename): extension = filename.split('.')[-1].lower() filename = "%s.%s" % (uuid.uuid4(), extension) return os.path.join("student-sertifikat/", filename) 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=[validate_npm], unique=True) resume = models.FileField(upload_to=get_student_resume_file_path, null=True, blank=True, validators=[FileExtensionValidator(['pdf'])]) sertifikat = models.FileField(upload_to=get_student_sertifikat_file_path, null=True, blank=True, validators=[validate_document_file_extension]) phone_number = models.CharField(max_length=100, blank=True, db_index=True, null=True, validators=[RegexValidator(r'^0\d{1,11}$')]) gender = models.CharField(max_length=30, blank=True, null=True) bookmarked_vacancies = models.ManyToManyField('core.Vacancy', related_name="bookmarked_vacancies", blank=True) applied_vacancies = models.ManyToManyField('core.Vacancy', related_name="applied_vacancies", blank=True, through='core.Application') birth_place = models.CharField(max_length=30, blank=True, null=True) birth_date = models.DateField(blank=True, null=True) major = models.CharField(max_length=30, blank=True, null=True) batch = models.CharField(max_length=4, blank=True, null=True) show_transcript = models.BooleanField(default=False) photo = models.FileField(upload_to=get_student_photo_file_path, null=True, blank=True, validators=[FileExtensionValidator(['jpg', 'jpeg', 'png'])]) self_description = models.CharField(max_length=500, blank=True, db_index=True, null=True) portfolio_link = models.URLField(blank=True, null=True) linkedin_url = models.URLField(max_length=200,blank=True, null=True) hackerrank_url = models.URLField(max_length=200,blank=True, null=True) website_url = models.URLField(max_length=200,blank=True, null=True) work_experience = models.CharField(max_length=500, blank=True, null=True) region = models.CharField(max_length=30, blank=True, null=True) alamat = models.CharField(max_length=50, blank=True, null=True) skills = models.CharField(max_length=50, blank=True, null=True) recommendations = models.CharField(max_length=500, blank=True, null=True) ui_ux_portofolio = models.FileField(upload_to=get_student_ui_ux_portofolio_file_path, null=True, blank=True, validators=[validate_document_file_extension]) latest_work = models.CharField(max_length=100, blank=True, null=True) latest_work_desc = models.TextField(blank=True, null=True) github_url = models.URLField(max_length=200,blank=True, null=True) intro = models.CharField(max_length=50, blank=True, null=True) expected_salary = models.CharField(max_length=10, blank=True, null=True) job_seeking_status = models.CharField(max_length=30, blank=True, null=True) student_gpa = models.FloatField(db_column='student_gpa', default=1.0, blank=True, null=True, validators=[validate_student_gpa]) volunteer = models.CharField(max_length=100, blank=True, null=True) awards = models.CharField(max_length=100, blank=True, null=True) projects = models.CharField(max_length=100, blank=True, null=True) certification = models.CharField(max_length=100, blank=True, null=True) languages = models.CharField(max_length= 100, blank=True, null=True) seminar = models.CharField(max_length=100, blank=True, null=True) interests = models.CharField(max_length=100, blank=True, null=True) dependants = models.IntegerField(db_column='dependants', default=0, blank=True, null=True) @property def name(self): return get_display_name(self.user) @property def full_name(self): return get_display_name(self.user, full_name=True) @property def age(self): return get_current_age(self.birth_date) def __unicode__(self): return u"Student {}".format(get_display_name(self.user)) class Meta: ordering = ['-updated'] class Company(models.Model): """ A user subclass """ NEW = 0 UNVERIFIED = 1 VERIFIED = 2 created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) user = models.OneToOneField(User) description = models.TextField() status = models.IntegerField(validators=[MaxValueValidator(2), MinValueValidator(0)) logo = models.FileField(upload_to=get_company_logo_file_path, null=True, blank=True, validators=[validate_image_file_extension]) address = models.CharField(max_length=1000, blank=True, null=True) category = models.CharField(max_length=140, default="Belum ada kategori perusahaan") website = models.CharField(max_length=100, default="Belum ada link website") @property def name(self): return get_display_name(self.user) def __unicode__(self): return u"Company {}".format(get_display_name(self.user)) class Meta: ordering = ['-updated'] 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) @property def name(self): return get_display_name(self.user) def __unicode__(self): return u"Supervisor {}".format(get_display_name(self.user)) class Meta: ordering = ['-updated']