Merge pull request #23 from IcyNet/create-databases

Initial Database layouts
This commit is contained in:
Tsa6 2017-08-26 15:22:19 -04:00 committed by GitHub
commit f2087f71ba
3 changed files with 382 additions and 0 deletions

View File

@ -1,3 +1,11 @@
from django.contrib import admin from django.contrib import admin
from .models import *
# Register your models here. # Register your models here.
admin.site.register(Show)
admin.site.register(User)
admin.site.register(Admin)
admin.site.register(Ban)
admin.site.register(ShowModerator)
admin.site.register(Report)
admin.site.register(ShowSubmission)

View File

@ -1,3 +1,375 @@
from django.db import models from django.db import models
from django.core.files.storage import FileSystemStorage
from django.conf import settings
import os
def name_artwork(inst, name):
return '%s/artwork.%s'%(inst.abbr,name.split('.')[-1])
def name_css(inst, name):
return '%s/style.css'%inst.abbr
def name_banner(inst, name):
return '%s/banner.%s'%(inst.abbr,name.split('.')[-1])
def name_season_artwork(inst, name):
return '%s/%d/artwork.%s'%(inst.show.abbr,inst.number,name.split('.')[-1])
show_static_storage = FileSystemStorage(location=os.path.join(os.path.dirname(settings.MEDIA_ROOT), 'uploaded_resources'), base_url='showstatic')
# Create your models here. # Create your models here.
class TimestampedModel(models.Model):
timestamp = models.DateTimeField(
auto_now=True,
help_text='The date and time this object was created'
)
class Meta:
abstract = True
class Show(TimestampedModel):
name = models.CharField(
max_length=40,
help_text="The full name of the show",
verbose_name="Full Name"
)
abbr = models.SlugField(
max_length=5,
unique=True,
help_text="A short abbreviation of the show, for use in urls",
verbose_name="Abbreviation"
)
description = models.TextField(
help_text="A description of the show",
verbose_name="Description"
)
release = models.DateField(
help_text="The release date of the first episode of the show",
verbose_name="Release Date"
)
artwork = models.ImageField(
storage=show_static_storage,
upload_to = name_artwork,
help_text="The artwork associated with the show. Should display the name of the show in a movie-poster esque format. Aspect ration should be about 2:3",
verbose_name="Artwork"
)
imdb = models.URLField(
help_text="The url of the IMDb page for this show",
verbose_name="IMDb Page"
)
moderated = models.BooleanField(
help_text="Whether or not this show is user-moderated",
verbose_name="User Moderated"
)
css = models.FileField(
storage=show_static_storage,
upload_to=name_css,
help_text="The CSS stylesheet applied to this show's page",
verbose_name="Custom Style"
)
banner = models.ImageField(
storage=show_static_storage,
upload_to = name_banner,
help_text="A banner used for the show's page.",
verbose_name="Artwork"
)
class User(TimestampedModel):
user_id = models.IntField(
help_text='The user id assigned to this user by IcyNet\'s auth servers'
)
email = models.EmailField(
help_text='This user\'s email address'
)
display_name=models.CharField(
max_length=20,
help_text="The name shown to other users",
verbose_name="Display Name"
)
favorites=models.ManyToManyField(
'Episode',
related_name='favorited_by',
through='Favorite'
)
watches=models.ManyToManyField(
'Episode',
related_name='watched_by',
through='Watch'
)
class Admin(User):
pass
class Ban(TimestampedModel):
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
help_text="The user this ban applies to",
verbose_name="Banned User"
)
admin = models.ForeignKey(
Admin,
on_delete=models.SET_NULL,
null=True,
help_text='The admin which banned this user',
verbose_name='Banned By',
related_name='bans'
)
reason = models.CharField(
max_length=50,
blank=True,
help_text='The reason this user was banned',
verbose_name='Ban Reason'
)
expiration = models.DateField(
help_text='The date this user will become unbanned',
blank=True,
verbose_name='Expiration Date'
)
permanent = models.BooleanField(
help_text='If checked, this user will never be unbanned, even if the expiration date passes',
verbose_name='Permanent'
)
scope = models.ManyToManyField(
Show,
help_text='The shows this user is banned from interacting with',
verbose_name='Banned From',
related_name='bans'
)
site_wide = models.BooleanField(
help_text='If checked, this is a site-wide ban, and the user is automatically banned from all shows, not just those in the Banned From (scope) paramenter',
verbose_name = 'Site Wide Ban'
)
class ShowModerator(TimestampedModel):
show = models.ForeignKey(
Show,
on_delete=models.CASCADE,
help_text='The show this user moderates',
verbose_name='Moderated Show',
related_name='moderators',
)
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
help_text='The user who moderates this show',
verbose_name='Moderator',
related_name='moderated_shows'
)
appointed_by = models.ForeignKey(
User,
on_delete=models.SET_NULL,
related_name='appointed_mods',
null=True,
help_text='The user who appointed this moderator',
verbose_name='Appointed by'
)
class Report(TimestampedModel):
reporter = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
related_name='reports',
help_text='The user who created this report',
verbose_name='Reporter'
)
title = models.CharField(
max_length=50,
help_text='A brief summary of the report',
verbose_name='Title'
)
details = models.TextField(
help_text='The details of the report, preferably including why the content should be removed',
verbose_name = 'Details'
)
url = models.URLField(
max_length=100,
help_text='The URL of the content being reported',
verbose_name = 'Content URL'
)
class ShowSubmission(TimestampedModel):
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='show_submissions',
help_text='The user who submitted this show',
verbose_name='Submitter'
)
name = Show.name
details = models.TextField(
help_text='Some details about the show. Why it should be added, where information about it can be found, etc.',
verbose_name='Details'
)
class Season(models.Model):
show = models.ForeignKey(
'Show',
on_delete=models.CASCADE,
related_name='seasons',
help_text='The show this season belongs to'
)
name = models.CharField(
max_length=40,
blank=True,
help_text='The name given to this season by its producers. Can be blank if no name was given',
verbose_name='Season Name'
)
number = models.IntegerField(
help_text='The number of this season, starting at 1; For example, the first season to be aired would be number 1, and the second would be number 2'
)
description = models.TextField(
help_text='A description of this season\'s happenings'
)
artwork = models.ImageField(
storage=show_static_storage,
upload_to = name_season_artwork,
help_text="The artwork associated with the season. Should display the name of the show in a movie-poster esque format. Aspect ration should be about 2:3",
verbose_name="Artwork",
blank=True
)
class Episode(models.Model):
show = models.ForeignKey(
'Show',
on_delete=models.CASCADE,
related_name='episodes',
help_text='The show this episode belongs to'
)
season = models.ForeignKey(
Season,
on_delete=models.CASCADE,
related_name='episodes',
help_text='The season this episode is from'
)
episode = models.IntegerField(
help_text='The position of this episode in the season. The first episode of the season to air would be episode number 1',
verbose_name='Episode Number'
)
name = models.CharField(
max_length=40,
help_text='The name given to this episode by its producers',
verbose_name='Episode Season'
)
summary = models.TextField(
help_text='A summary of this episode'
)
airdate = models.DateField(
help_text='The date this episode officially aired for the first time',
verbose_name='Original Air Date'
)
class Submission(TimestampedModel):
episode = models.ForeignKey(
Episode,
on_delete=models.CASCADE,
related_name='submissions',
help_text='What episode this link contains a mirror of',
verbose_name='Submitted For'
)
user = models.ForeignKey(
'User',
on_delete=models.SET_NULL,
null=True,
related_name='submissions',
help_text='The user who submitted this link'
)
url = models.URLField(
help_text='The link that was submitted',
)
tags = models.CharField(
help_text='Tags applied to this link submission',
max_length=200
)
class SubmissionVote(TimestampedModel):
submission = models.ForeignKey(
Submission,
on_delete=models.CASCADE,
related_name='votes',
help_text='What this submission was cast on'
)
user = models.ForeignKey(
'User',
on_delete=models.CASCADE,
related_name='votes',
help_text='The user who cast this vote'
)
positive = models.BooleanField(
help_text='If this is true, the vote is an upvote. Otherwise, it is a downvote'
)
class Favorite(TimestampedModel):
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
episode = models.ForeignKey(
Episode,
on_delete=models.CASCADE
)
class Watch(TimestampedModel):
user = models.ForeignKey(
User,
on_delete=models.CASCADE
)
episode = models.ForeignKey(
Episode,
on_delete=models.CASCADE
)
class DiscussionBoard(TimestampedModel):
show = models.ForeignKey(
Show,
on_delete=models.CASCADE,
related_name='discussion_boards',
help_text='The show this discussion was created for'
)
user = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
related_name='discussion_boards',
help_text='The user that created this discussion'
)
title = models.CharField(
max_length=100,
help_text='The title of the discussion'
)
body = models.TextField(
help_text='The body of the post',
verbose_name='Body'
)
class DiscussionReply(TimestampedModel):
board = models.ForeignKey(
DiscussionBoard,
on_delete=models.CASCADE,
related_name='replies',
help_text='The discussion board this was created in reply to'
)
user = models.ForeignKey(
User,
on_delete=models.SET_NULL,
null=True,
related_name='replies',
help_text='The user that posted this reply'
)
body = models.TextField(
help_text='The body of the response',
verbose_name='Body'
)
class DiscussionVote(TimestampedModel):
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='discussion_votes',
help_text='The user which cast this vote'
)
board = models.ForeignKey(
DiscussionBoard,
on_delete=models.CASCADE,
related_name='votes',
help_text='The board this vote was cast on'
)
postive = models.BooleanField(
help_text='If true, the vote is an upvote. Otherwise, it is a downvote. Neutral votes are not recorded'
)

2
requirements.txt Normal file
View File

@ -0,0 +1,2 @@
Django==1.11.4
Pillow=4.2.1