|
| 1 | +from django.db import models |
| 2 | +from django.dispatch import receiver |
| 3 | +from django.db.models.signals import post_save |
| 4 | +from recommender_webapp.common.utils import ChoiceEnum |
| 5 | +from django.utils.translation import ugettext_lazy as _ |
| 6 | +from django.contrib.auth.base_user import BaseUserManager |
| 7 | +from django.contrib.auth.models import User, AbstractUser |
| 8 | + |
| 9 | + |
| 10 | +class UserManager(BaseUserManager): |
| 11 | + """Define a model manager for User model with no username field.""" |
| 12 | + |
| 13 | + use_in_migrations = True |
| 14 | + |
| 15 | + def _create_user(self, email, password, **extra_fields): |
| 16 | + """Create and save a User with the given email and password.""" |
| 17 | + if not email: |
| 18 | + raise ValueError('The given email must be set') |
| 19 | + email = self.normalize_email(email) |
| 20 | + user = self.model(email=email, **extra_fields) |
| 21 | + user.set_password(password) |
| 22 | + user.save(using=self._db) |
| 23 | + return user |
| 24 | + |
| 25 | + def create_user(self, email, password=None, **extra_fields): |
| 26 | + """Create and save a regular User with the given email and password.""" |
| 27 | + extra_fields.setdefault('is_staff', False) |
| 28 | + extra_fields.setdefault('is_superuser', False) |
| 29 | + return self._create_user(email, password, **extra_fields) |
| 30 | + |
| 31 | + def create_superuser(self, email, password, **extra_fields): |
| 32 | + """Create and save a SuperUser with the given email and password.""" |
| 33 | + extra_fields.setdefault('is_staff', True) |
| 34 | + extra_fields.setdefault('is_superuser', True) |
| 35 | + |
| 36 | + if extra_fields.get('is_staff') is not True: |
| 37 | + raise ValueError('Superuser must have is_staff=True.') |
| 38 | + if extra_fields.get('is_superuser') is not True: |
| 39 | + raise ValueError('Superuser must have is_superuser=True.') |
| 40 | + |
| 41 | + return self._create_user(email, password, **extra_fields) |
| 42 | + |
| 43 | + |
| 44 | +class User(AbstractUser): |
| 45 | + """User model.""" |
| 46 | + |
| 47 | + username = None |
| 48 | + email = models.EmailField(_('email address'), unique=True) |
| 49 | + |
| 50 | + USERNAME_FIELD = 'email' |
| 51 | + REQUIRED_FIELDS = [] |
| 52 | + |
| 53 | + objects = UserManager() |
| 54 | + |
| 55 | + |
| 56 | +class Profile(models.Model): |
| 57 | + user = models.OneToOneField(User, null=True, blank=True, on_delete=models.SET_NULL) |
| 58 | + userId = models.AutoField(primary_key=True) |
| 59 | + location = models.CharField(max_length=40, blank=False) |
| 60 | + birth_date = models.DateField(null=True, blank=True) |
| 61 | + bio = models.TextField(max_length=500, blank=True) |
| 62 | + profession = models.CharField(max_length=40, blank=True) |
| 63 | + empathy = models.FloatField(null=True, blank=True) |
| 64 | + |
| 65 | + def __str__(self): |
| 66 | + return str(self.userId) + '|' + self.location + '|' + self.birth_date.strftime('%d/%m/%Y') |
| 67 | + |
| 68 | + |
| 69 | +@receiver(post_save, sender=User) |
| 70 | +def update_user_profile(sender, instance, created, **kwargs): |
| 71 | + if created: |
| 72 | + Profile.objects.create(user=instance) |
| 73 | + instance.profile.save() |
| 74 | + |
| 75 | + |
| 76 | +class Place(models.Model): |
| 77 | + placeId = models.IntegerField(primary_key=True) |
| 78 | + name = models.CharField(max_length=100, blank=False) |
| 79 | + location = models.CharField(max_length=40, blank=False) |
| 80 | + freeEntry = models.BooleanField() |
| 81 | + bere = models.BooleanField() |
| 82 | + mangiare = models.BooleanField() |
| 83 | + benessere = models.BooleanField() |
| 84 | + dormire = models.BooleanField() |
| 85 | + goloso = models.BooleanField() |
| 86 | + libri = models.BooleanField() |
| 87 | + romantico = models.BooleanField() |
| 88 | + museo = models.BooleanField() |
| 89 | + spiaggia = models.BooleanField() |
| 90 | + teatro = models.BooleanField() |
| 91 | + |
| 92 | + def __str__(self): |
| 93 | + return str(self.placeId) + '|' + self.name + '|' + self.location |
| 94 | + |
| 95 | + |
| 96 | +class Mood(ChoiceEnum): |
| 97 | + angry = 1 |
| 98 | + joyful = 2 |
| 99 | + sad = 3 |
| 100 | + |
| 101 | + |
| 102 | +class Companionship(ChoiceEnum): |
| 103 | + withFriends = 1 |
| 104 | + alone = 2 |
| 105 | + |
| 106 | + |
| 107 | +class Rating(models.Model): |
| 108 | + id = models.AutoField(primary_key=True) |
| 109 | + userId = models.ForeignKey(Profile, on_delete=models.PROTECT, blank=False) |
| 110 | + mood = models.CharField(max_length=1, choices=Mood.choices(), blank=False) |
| 111 | + companionship = models.CharField(max_length=1, choices=Companionship.choices(), blank=False) |
| 112 | + placeId = models.ForeignKey(Place, on_delete=models.PROTECT, blank=False) |
| 113 | + rating = models.IntegerField(blank=False) |
| 114 | + |
| 115 | + class Meta: |
| 116 | + unique_together = ('userId', 'mood', 'companionship', 'placeId') |
| 117 | + |
| 118 | + def __str__(self): |
| 119 | + return str(self.userId) + '|' + str(self.mood) + '|' + str(self.companionship) \ |
| 120 | + + '|' + str(self.placeId) + '|' + str(self.rating) |
0 commit comments