from users.models import CustomUser
from django.db import models
from multiselectfield import MultiSelectField
from django.db.models import Q
import re
class Type(models.Model):
name = models.CharField(max_length=10, primary_key=True)
def __str__(self):
return self.name
class Fandom(models.Model):
id_fandom = models.AutoField(primary_key=True)
name = models.CharField(max_length=30, blank=False, null=False)
type_name = models.ForeignKey(Type, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Character(models.Model):
id_character = models.AutoField(primary_key=True)
name_surname = models.CharField(max_length=255, unique=True, blank=False,
null=False)
fandom_id = models.ForeignKey(Fandom, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.name_surname
class Fanfic(models.Model):
id_fanfic = models.AutoField(primary_key=True)
name = models.CharField(max_length=255, blank=False, null=False)
author = models.CharField(max_length=255, blank=False, null=False)
web = models.CharField(max_length=255, blank=False, null=False,
unique=True)
language = models.CharField(max_length=255, blank=True, null=True)
GENRE = (
('adv', 'adventure'),
('ang', 'angst'),
('dra', 'drama'),
('fri', 'friendship'),
('gen', 'general'),
('hum', 'humor'),
('hur', 'hurt/comfort'),
('mys', 'mystery'),
('rom', 'romance'),
('tra', 'tragedy')
)
genre1 = MultiSelectField(choices=GENRE, blank=False, null=False)
genre2 = MultiSelectField(choices=GENRE, blank=True, null=True)
genre3 = MultiSelectField(choices=GENRE, blank=True, null=True)
genre4 = MultiSelectField(choices=GENRE, blank=True, null=True)
last_time_checked = models.DateTimeField(blank=True, null=True)
STATUS = (
('c', 'completed'),
('i', 'in progress'),
)
status = models.CharField(max_length=1, choices=STATUS, blank=False,
null=False)
last_time_updated = models.DateTimeField(blank=True, null=True)
numChapters = models.IntegerField(blank=True, null=True)
numWords = models.IntegerField(blank=True, null=True)
RATING = (
('a', 'K -> T'),
('b', 'K -> K+'),
('c', 'K'),
('d', 'K+'),
('e', 'T'),
('f', 'M'),
)
rating = models.CharField(max_length=1, choices=RATING, blank=True,
null=True)
average_score = models.FloatField(blank=True, null=True)
def __str__(self):
return self.name
def get_domain(self):
''' Returns the domain of where it's hosted '''
regex = "(http[s]?|www\.)"
split_url = re.compile(regex).split(self.web)
split_url = split_url[len(split_url)-1]
regex = "(:?[\/]{2})"
split_url = re.compile(regex).split(split_url)
split_url = split_url[len(split_url)-1]
regex = "\.[\D]{3}\/"
split_url = re.compile(regex).split(split_url)
domain_name = split_url[0]
return domain_name
@staticmethod
def get_similar_by_title_and_author(title, author):
''' Gets the fanfics with similar title and author to
the given ones
'''
qset = Q()
for term in title.split():
qset |= Q(name__icontains=term)
similar_to_title = Fanfic.objects.filter(qset)
similar_to_author = Fanfic.objects.filter(
author__icontains=author)
similar = similar_to_author | similar_to_title
return similar
class Pairing(models.Model):
fanfic_id = models.ForeignKey(Fanfic, on_delete=models.CASCADE)
group = models.IntegerField(blank=False, null=False)
character_id = models.ForeignKey(Character, on_delete=models.CASCADE)
class CharacterFanfic(models.Model):
character_id = models.ForeignKey(Character, on_delete=models.CASCADE)
fanfic_id = models.ForeignKey(Fanfic, on_delete=models.CASCADE)
class Review(models.Model):
id_review = models.AutoField(primary_key=True)
text = models.TextField(blank=True, null=True)
score = models.FloatField(blank=True, null=True)
date = models.DateField(auto_now=True)
fanfic_id = models.ForeignKey(Fanfic, on_delete=models.CASCADE)
user_id = models.ForeignKey(CustomUser, on_delete=models.SET_NULL,
null=True)
class FandomFanfic(models.Model):
fandom_id = models.ForeignKey(Fandom, on_delete=models.CASCADE)
fanfic_id = models.ForeignKey(Fanfic, on_delete=models.CASCADE)
class Related(models.Model):
fanfic_id_one = models.ForeignKey(Fanfic, on_delete=models.CASCADE,
related_name="fanfic_one")
fanfic_id_two = models.ForeignKey(Fanfic, on_delete=models.CASCADE,
related_name="fanfic_two")
class Following(models.Model):
user_id_one = models.ForeignKey(CustomUser, on_delete=models.SET_NULL,
null=True,
related_name="user_one_following")
user_id_two = models.ForeignKey(CustomUser, on_delete=models.SET_NULL,
null=True,
related_name="user_two_following")
date = models.DateField(auto_now=True)
class PrivateMessage(models.Model):
user_id_sender = models.ForeignKey(CustomUser, on_delete=models.SET_NULL,
null=True, related_name="user_sender")
user_id_receiver = models.ForeignKey(CustomUser, on_delete=models.SET_NULL,
null=True,
related_name="user_receiver")
text = models.TextField(blank=False, null=False)
subject = models.CharField(max_length=100, blank=False, null=False)
date = models.DateField(auto_now=True)
class Chapter(models.Model):
id_chapter = models.AutoField(primary_key=True)
title = models.CharField(max_length=255, blank=True, null=True)
num_chapter = models.IntegerField(blank=False, null=False)
url_chapter = models.CharField(max_length=255, blank=True, null=True)
fanfic_id = models.ForeignKey(Fanfic, on_delete=models.SET_NULL, null=True)
class Reading(models.Model):
chapter_id = models.ForeignKey(Chapter, on_delete=models.SET_NULL,
null=True)
user_id = models.ForeignKey(CustomUser, on_delete=models.SET_NULL,
null=True)
date = models.DateField(auto_now=True)
private_notes = models.TextField(blank=True, null=True)
class List(models.Model):
id_list = models.AutoField(primary_key=True)
name = models.CharField(max_length=255, blank=False, null=False,
unique=True)
user_id = models.ForeignKey(CustomUser, on_delete=models.SET_NULL,
null=True)
def __str__(self):
return self.name
class FanficList(models.Model):
list_id = models.ForeignKey(List, on_delete=models.CASCADE)
fanfic_id = models.ForeignKey(Fanfic, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now=True)
|