more apps
This commit is contained in:
0
plan/__init__.py
Normal file
0
plan/__init__.py
Normal file
11
plan/admin.py
Normal file
11
plan/admin.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
from plan.models import Day, SessionBearLakes, SessionUssuriysk, Upload, UserProfile
|
||||
|
||||
admin.site.register(Day)
|
||||
admin.site.register(Upload)
|
||||
admin.site.register(UserProfile)
|
||||
admin.site.register(SessionBearLakes)
|
||||
admin.site.register(SessionUssuriysk)
|
||||
|
5
plan/apps.py
Normal file
5
plan/apps.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class PlanConfig(AppConfig):
|
||||
name = 'plan'
|
86
plan/migrations/0001_initial.py
Normal file
86
plan/migrations/0001_initial.py
Normal file
@@ -0,0 +1,86 @@
|
||||
# Generated by Django 2.2.6 on 2019-12-09 18:12
|
||||
|
||||
from django.conf import settings
|
||||
import django.core.files.storage
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import plan.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Day',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=100)),
|
||||
('Notes', models.TextField(blank=True, max_length=2000, null=True, validators=[django.core.validators.MaxLengthValidator(1600)], verbose_name='Notes')),
|
||||
('date', models.DateField(blank=True, null=True)),
|
||||
('DayNumber', models.IntegerField()),
|
||||
('modified', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='UserProfile',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Upload',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=128)),
|
||||
('filename', models.CharField(max_length=256)),
|
||||
('filefield', models.FileField(storage=django.core.files.storage.FileSystemStorage(location='/srv/srg-plan/srg/Uploads'), upload_to=plan.models.upload_filename, validators=[plan.models.validate_upload_file])),
|
||||
('uploaded', models.DateTimeField(auto_now_add=True)),
|
||||
('day', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='plan.Day', verbose_name='Day')),
|
||||
('owner', models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='plan.UserProfile', verbose_name='Author')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='SessionUssuriysk',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(blank=True, max_length=100)),
|
||||
('TimeBegin_hh', models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(24)])),
|
||||
('TimeEnd_hh', models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(24)])),
|
||||
('TimeBegin_mm', models.IntegerField(blank=True, default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(60)])),
|
||||
('TimeEnd_mm', models.IntegerField(blank=True, default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(60)])),
|
||||
('sysSessionRequest', models.IntegerField(default=0)),
|
||||
('eroSessionRequest', models.IntegerField(default=0)),
|
||||
('artSessionRequest', models.IntegerField(default=0)),
|
||||
('sysNotes', models.TextField(blank=True, max_length=2000, null=True, verbose_name='System Notes')),
|
||||
('eroNotes', models.TextField(blank=True, max_length=2000, null=True, verbose_name='eRosita Notes')),
|
||||
('artNotes', models.TextField(blank=True, max_length=2000, null=True, verbose_name='ART-XC Notes')),
|
||||
('Day', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='UssuriyskDay', to='plan.Day', verbose_name='Day')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='SessionBearLakes',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(blank=True, max_length=100)),
|
||||
('TimeBegin_hh', models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(24)])),
|
||||
('TimeEnd_hh', models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(24)])),
|
||||
('TimeBegin_mm', models.IntegerField(blank=True, default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(60)])),
|
||||
('TimeEnd_mm', models.IntegerField(blank=True, default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(60)])),
|
||||
('sysSessionRequest', models.IntegerField(default=0)),
|
||||
('eroSessionRequest', models.IntegerField(default=0)),
|
||||
('artSessionRequest', models.IntegerField(default=0)),
|
||||
('sysNotes', models.TextField(blank=True, max_length=2000, null=True, validators=[django.core.validators.MaxLengthValidator(1600)], verbose_name='System Notes')),
|
||||
('eroNotes', models.TextField(blank=True, max_length=2000, null=True, validators=[django.core.validators.MaxLengthValidator(1600)], verbose_name='eRosita Notes')),
|
||||
('artNotes', models.TextField(blank=True, max_length=2000, null=True, validators=[django.core.validators.MaxLengthValidator(1600)], verbose_name='ART-XC Notes')),
|
||||
('Day', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='BearLakesDay', to='plan.Day', verbose_name='Day')),
|
||||
],
|
||||
),
|
||||
]
|
38
plan/migrations/0002_auto_20211229_1259.py
Normal file
38
plan/migrations/0002_auto_20211229_1259.py
Normal file
@@ -0,0 +1,38 @@
|
||||
# Generated by Django 3.2.10 on 2021-12-29 09:59
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('plan', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='day',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sessionbearlakes',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sessionussuriysk',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='upload',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='userprofile',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
]
|
0
plan/migrations/__init__.py
Normal file
0
plan/migrations/__init__.py
Normal file
262
plan/models.py
Normal file
262
plan/models.py
Normal file
@@ -0,0 +1,262 @@
|
||||
import logging
|
||||
from django.db import models
|
||||
from django import forms
|
||||
from django.core.exceptions import ValidationError
|
||||
import time
|
||||
import datetime
|
||||
import re
|
||||
from django.core.validators import MaxLengthValidator, MinValueValidator, MaxValueValidator
|
||||
from django.utils import timezone
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils.translation import ugettext as _, ugettext_noop as _noop
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
import hashlib
|
||||
import os, os.path as osp
|
||||
from django.utils.translation import gettext_lazy
|
||||
|
||||
# Create your models here.
|
||||
LaunchDate = datetime.date(2019, 7, 13)
|
||||
root=''
|
||||
INPUT_DATA_DIR='/export/django/srg/data'
|
||||
|
||||
from django.core.files.storage import FileSystemStorage
|
||||
from django.core.validators import EmailValidator
|
||||
from django.core.validators import MaxLengthValidator
|
||||
|
||||
PRESENTATIONS_PATH = '/srv/srg-plan/srg/Uploads'
|
||||
|
||||
email_notification=['krivonos@iki.rssi.ru',]
|
||||
|
||||
readme_txt='/srv/srg-plan/srg/README.txt'
|
||||
|
||||
def get_session_duration_in_min(begin_hh, begin_mm, end_hh, end_mm):
|
||||
if (end_hh > begin_hh):
|
||||
return (end_hh-begin_hh)*60+end_mm-begin_mm
|
||||
else:
|
||||
return (24-begin_hh+end_hh)*60+end_mm-begin_mm
|
||||
|
||||
|
||||
class Day(models.Model):
|
||||
title = models.CharField(max_length=100)
|
||||
Notes = models.TextField("Notes",max_length=2000, null=True, blank=True, validators=[MaxLengthValidator(1600)])
|
||||
date = models.DateField(blank=True, null=True)
|
||||
DayNumber = models.IntegerField()
|
||||
modified = models.DateTimeField(auto_now=True)
|
||||
def __unicode__(self):
|
||||
return 'Day: ' + "%i" % (self.DayNumber)
|
||||
def __str__(self):
|
||||
return 'Day: ' + "%i" % (self.DayNumber)
|
||||
def get_upload_url(self):
|
||||
return "/plan/day/%i/upload" % (self.pk)
|
||||
def get_absolute_url(self):
|
||||
return "/plan/day/%i" % (self.pk)
|
||||
|
||||
class SessionBearLakes(models.Model):
|
||||
Day = models.OneToOneField(Day, on_delete=models.CASCADE,verbose_name="Day", related_name="BearLakesDay",null=True)
|
||||
title = models.CharField(max_length=100,blank=True)
|
||||
TimeBegin_hh = models.IntegerField(default=0,validators=[MinValueValidator(0),MaxValueValidator(24)])
|
||||
TimeEnd_hh = models.IntegerField(default=0,validators=[MinValueValidator(0),MaxValueValidator(24)])
|
||||
TimeBegin_mm = models.IntegerField(default=0,validators=[MinValueValidator(0),MaxValueValidator(60)],blank=True)
|
||||
TimeEnd_mm = models.IntegerField(default=0,validators=[MinValueValidator(0),MaxValueValidator(60)],blank=True)
|
||||
sysSessionRequest = models.IntegerField(default=0)
|
||||
eroSessionRequest = models.IntegerField(default=0)
|
||||
artSessionRequest = models.IntegerField(default=0)
|
||||
sysNotes = models.TextField("System Notes",max_length=2000, null=True, blank=True, validators=[MaxLengthValidator(1600)])
|
||||
eroNotes = models.TextField("eRosita Notes",max_length=2000, null=True, blank=True, validators=[MaxLengthValidator(1600)])
|
||||
artNotes = models.TextField("ART-XC Notes",max_length=2000, null=True, blank=True, validators=[MaxLengthValidator(1600)])
|
||||
def clean(self, *args, **kwargs):
|
||||
# add custom validation here
|
||||
|
||||
session_duration_min=get_session_duration_in_min(self.TimeBegin_hh,self.TimeBegin_mm, self.TimeEnd_hh,self.TimeEnd_mm)
|
||||
request_min=(self.sysSessionRequest+self.eroSessionRequest+self.artSessionRequest)
|
||||
if (request_min>session_duration_min):
|
||||
msg="Total requested time (sys:%i + ero:%i + art:%i = %i min) cannot be longer than session duration: %i min" % (self.sysSessionRequest,
|
||||
self.eroSessionRequest,
|
||||
self.artSessionRequest,
|
||||
request_min,
|
||||
session_duration_min)
|
||||
raise forms.ValidationError(msg)
|
||||
super(SessionBearLakes, self).clean(*args, **kwargs)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_clean()
|
||||
super(SessionBearLakes, self).save(*args, **kwargs)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.title
|
||||
def __str__(self):
|
||||
return 'Session: Day ' + "%i" % (self.Day.DayNumber)
|
||||
def get_absolute_url(self):
|
||||
return root+"/plan/BearLakes/%i/show" % (self.Day.DayNumber)
|
||||
def get_update_url(self):
|
||||
return root+"/plan/BearLakes/%i/update" % (self.Day.DayNumber)
|
||||
def get_rest(self):
|
||||
session_duration_min=get_session_duration_in_min(self.TimeBegin_hh,self.TimeBegin_mm, self.TimeEnd_hh,self.TimeEnd_mm)
|
||||
request_min=(self.sysSessionRequest+self.eroSessionRequest+self.artSessionRequest)
|
||||
return "%i" % (session_duration_min - request_min)
|
||||
|
||||
|
||||
class SessionBearLakesForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model=SessionBearLakes
|
||||
fields=('title','TimeBegin_hh','TimeBegin_mm','TimeEnd_hh','TimeEnd_mm','sysSessionRequest','eroSessionRequest','artSessionRequest','sysNotes','eroNotes','artNotes')
|
||||
widgets = {
|
||||
'title': forms.TextInput(attrs={'style': 'width: 620px;', 'class': 'title'}),
|
||||
'TimeBegin_hh': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'TimeBegin_mm': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'TimeEnd_hh': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'TimeEnd_mm': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'sysSessionRequest': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'eroSessionRequest': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'artSessionRequest': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'sysNotes': forms.Textarea(attrs={'style': 'width: 620px;', 'rows': 10}),
|
||||
'eroNotes': forms.Textarea(attrs={'style': 'width: 620px;', 'rows': 10}),
|
||||
'artNotes': forms.Textarea(attrs={'style': 'width: 620px;', 'rows': 10}),
|
||||
}
|
||||
|
||||
class SessionUssuriysk(models.Model):
|
||||
Day = models.OneToOneField(Day, on_delete=models.CASCADE,verbose_name="Day",related_name="UssuriyskDay",null=True)
|
||||
title = models.CharField(max_length=100,blank=True)
|
||||
TimeBegin_hh = models.IntegerField(default=0,validators=[MinValueValidator(0),MaxValueValidator(24)])
|
||||
TimeEnd_hh = models.IntegerField(default=0,validators=[MinValueValidator(0),MaxValueValidator(24)])
|
||||
TimeBegin_mm = models.IntegerField(default=0,validators=[MinValueValidator(0),MaxValueValidator(60)],blank=True)
|
||||
TimeEnd_mm = models.IntegerField(default=0,validators=[MinValueValidator(0),MaxValueValidator(60)],blank=True)
|
||||
sysSessionRequest = models.IntegerField(default=0)
|
||||
eroSessionRequest = models.IntegerField(default=0)
|
||||
artSessionRequest = models.IntegerField(default=0)
|
||||
sysNotes = models.TextField("System Notes",max_length=2000, null=True, blank=True) #,validators=[MaxLengthValidator(1600)])
|
||||
eroNotes = models.TextField("eRosita Notes",max_length=2000, null=True, blank=True) #,validators=[MaxLengthValidator(1600)])
|
||||
artNotes = models.TextField("ART-XC Notes",max_length=2000, null=True, blank=True) #,validators=[MaxLengthValidator(1600)])
|
||||
def clean(self, *args, **kwargs):
|
||||
# add custom validation here
|
||||
session_duration_min=get_session_duration_in_min(self.TimeBegin_hh,self.TimeBegin_mm, self.TimeEnd_hh,self.TimeEnd_mm)
|
||||
request_min=(self.sysSessionRequest+self.eroSessionRequest+self.artSessionRequest)
|
||||
if (request_min>session_duration_min):
|
||||
msg="Total requested time (sys:%i + ero:%i + art:%i = %i min) cannot be longer than session duration: %i min" % (self.sysSessionRequest,
|
||||
self.eroSessionRequest,
|
||||
self.artSessionRequest,
|
||||
request_min,
|
||||
session_duration_min)
|
||||
raise forms.ValidationError(msg)
|
||||
super(SessionUssuriysk, self).clean(*args, **kwargs)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_clean()
|
||||
super(SessionUssuriysk, self).save(*args, **kwargs)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.title
|
||||
def __str__(self):
|
||||
return 'Session: Day ' + "%i" % (self.Day.DayNumber)
|
||||
def get_absolute_url(self):
|
||||
return root+"/plan/Ussuriysk/%i/show" % (self.Day.DayNumber)
|
||||
def get_update_url(self):
|
||||
return root+"/plan/Ussuriysk/%i/update" % (self.Day.DayNumber)
|
||||
def get_rest(self):
|
||||
session_duration_min=get_session_duration_in_min(self.TimeBegin_hh,self.TimeBegin_mm, self.TimeEnd_hh,self.TimeEnd_mm)
|
||||
request_min=(self.sysSessionRequest+self.eroSessionRequest+self.artSessionRequest)
|
||||
return "%i" % (session_duration_min - request_min)
|
||||
|
||||
class SessionUssuriyskForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model=SessionUssuriysk
|
||||
fields=('title','TimeBegin_hh','TimeBegin_mm','TimeEnd_hh','TimeEnd_mm','sysSessionRequest','eroSessionRequest','artSessionRequest','sysNotes','eroNotes','artNotes')
|
||||
widgets = {
|
||||
'title': forms.TextInput(attrs={'style': 'width: 620px;', 'class': 'title'}),
|
||||
'TimeBegin_hh': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'TimeBegin_mm': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'TimeEnd_hh': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'TimeEnd_mm': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'sysSessionRequest': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'eroSessionRequest': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'artSessionRequest': forms.TextInput(attrs={'style': 'width: 70px;', 'class': 'title'}),
|
||||
'sysNotes': forms.Textarea(attrs={'style': 'width: 620px;', 'rows': 10}),
|
||||
'eroNotes': forms.Textarea(attrs={'style': 'width: 620px;', 'rows': 10}),
|
||||
'artNotes': forms.Textarea(attrs={'style': 'width: 620px;', 'rows': 10}),
|
||||
}
|
||||
|
||||
FS = FileSystemStorage(location=PRESENTATIONS_PATH)
|
||||
|
||||
VALID_CONTENT_TYPES = ['application/pdf', 'image/png', 'application/vnd.ms-powerpoint','application/octet-stream',
|
||||
'application/nappdf','application/x-pdf','application/x-bzpdf',
|
||||
'application/x-gzpdf','application/force-download','application/x-file-download',
|
||||
'application/vnd.openxmlformats-officedocument.presentationml.presentation'
|
||||
]
|
||||
|
||||
VALID_EXTENSIONS = ['.pdf', '.ppt', '.pptx', '.png', '.txt', '.dat']
|
||||
|
||||
def validate_upload_file(value):
|
||||
file = value.file
|
||||
|
||||
_, ext = osp.splitext(file.name)
|
||||
if ext not in VALID_EXTENSIONS:
|
||||
raise forms.ValidationError(
|
||||
'Extension %s not supported.' % ext
|
||||
)
|
||||
|
||||
if file.content_type not in VALID_CONTENT_TYPES:
|
||||
raise forms.ValidationError(
|
||||
'Filetype %s not supported.' % file.content_type
|
||||
)
|
||||
|
||||
|
||||
def upload_filename(instance, filename):
|
||||
_, ext = osp.splitext(filename)
|
||||
|
||||
tohash = filename + str(time.clock())
|
||||
#new_fname = hashlib.md5(tohash).hexdigest()
|
||||
new_fname = hashlib.md5(tohash.encode('utf-8')).hexdigest()
|
||||
return new_fname + ext
|
||||
|
||||
class UserProfile(models.Model):
|
||||
user = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE)
|
||||
#target_list = models.ManyToManyField(Target, blank=True)
|
||||
#docker_list = models.ManyToManyField(DockerProxy, blank=True)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.user.email
|
||||
def __str__(self):
|
||||
return self.user.email
|
||||
def get_objects(self):
|
||||
return self.object_set.all()
|
||||
|
||||
class LoginUsernameForm(forms.Form):
|
||||
username = forms.CharField(max_length=75, label="User name", widget=forms.TextInput(attrs={'class':'form-control', 'style': 'width: 450px;'}))
|
||||
password = forms.CharField( widget=forms.PasswordInput(attrs={'class':'form-control', 'style': 'width: 450px;'}), label="Your Password" )
|
||||
def clean_username(self):
|
||||
username = self.cleaned_data.get('username')
|
||||
try:
|
||||
User.objects.get(username=username)
|
||||
except User.DoesNotExist:
|
||||
raise forms.ValidationError('This username is no such username.')
|
||||
return username
|
||||
|
||||
class Upload(models.Model):
|
||||
owner = models.ForeignKey(UserProfile, on_delete=models.CASCADE, default=None, unique=False, verbose_name="Author")
|
||||
day = models.ForeignKey(Day, unique=False, verbose_name="Day", on_delete=models.CASCADE)
|
||||
title = models.CharField(max_length=128)
|
||||
filename = models.CharField(max_length=256)
|
||||
filefield = models.FileField(upload_to=upload_filename, storage=FS, validators=[validate_upload_file])
|
||||
uploaded = models.DateTimeField(auto_now_add=True)
|
||||
#read_only = models.BooleanField("Read only", default=False)
|
||||
def get_delete_url(self):
|
||||
return self.day.get_absolute_url() + "/upload/%d/delete" % (self.id)
|
||||
|
||||
def delete(self, remove_file=True):
|
||||
if remove_file:
|
||||
FS.delete(str(self.filefield))
|
||||
return models.Model.delete(self)
|
||||
def __str__(self):
|
||||
return '['+"%d" % (self.day.DayNumber)+'] '+self.title
|
||||
|
||||
|
||||
class UploadForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Upload
|
||||
fields = ('title', 'filefield')
|
||||
widgets = {
|
||||
'title': forms.TextInput(attrs={'style': 'width: 620px;', 'class': 'title'}),
|
||||
}
|
||||
|
3
plan/tests.py
Normal file
3
plan/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
17
plan/urls.py
Normal file
17
plan/urls.py
Normal file
@@ -0,0 +1,17 @@
|
||||
from django.urls import path
|
||||
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.index, name='index'),
|
||||
path('BearLakes/<int:day>/show', views.show_SessionBearLakes, name='showBearLakes'),
|
||||
path('BearLakes/<int:day>/update', views.update_SessionBearLakes, name='showBearLakes'),
|
||||
path('Ussuriysk/<int:day>/show', views.show_SessionUssuriysk, name='showUssuriysk'),
|
||||
path('Ussuriysk/<int:day>/update', views.update_SessionUssuriysk, name='showUssuriysk'),
|
||||
path('day/<int:day_id>/upload', views.upload, name='upload'),
|
||||
path('day/<int:day_id>/upload/<int:upload_id>/delete', views.delete_upload, name='delete'),
|
||||
path('day/<int:day_id>', views.show_day, name='show'),
|
||||
path('login', views.login_username, name='login'),
|
||||
path('logout', views.logout_view, name='logout'),
|
||||
]
|
||||
|
196
plan/views.py
Normal file
196
plan/views.py
Normal file
@@ -0,0 +1,196 @@
|
||||
from django.shortcuts import render
|
||||
from django.http import HttpResponse
|
||||
from datetime import date
|
||||
from plan.models import Day, SessionBearLakes, SessionBearLakesForm, SessionUssuriysk, SessionUssuriyskForm, LoginUsernameForm, UserProfile, UploadForm, Upload
|
||||
from plan.models import INPUT_DATA_DIR
|
||||
from plan.models import LaunchDate
|
||||
from django.http import HttpResponseRedirect
|
||||
import datetime
|
||||
from django.utils import timezone
|
||||
import astropy
|
||||
import pandas as pd
|
||||
|
||||
from django.utils import timezone
|
||||
from django.contrib.auth import authenticate, login, logout
|
||||
from django.contrib.auth.models import User
|
||||
from django.core.files.storage import FileSystemStorage
|
||||
|
||||
# Create your views here. Berkeley
|
||||
|
||||
def index(request):
|
||||
if request.user.is_authenticated:
|
||||
try:
|
||||
user_profile=request.user.profile
|
||||
except:
|
||||
return HttpResponse("docker: no UserProfile.")
|
||||
else:
|
||||
return HttpResponse("docker: not authenticated.")
|
||||
all_bearlakes = SessionBearLakes.objects.all()
|
||||
return render(request,'plan/show_plan.html', {'bearlakes': all_bearlakes,'LaunchDate':LaunchDate})
|
||||
|
||||
|
||||
def show_day(request, day_id):
|
||||
if request.user.is_authenticated:
|
||||
try:
|
||||
user_profile=request.user.profile
|
||||
except:
|
||||
return HttpResponse("docker: no UserProfile.")
|
||||
else:
|
||||
return HttpResponse("docker: not authenticated.")
|
||||
try:
|
||||
myday=Day.objects.get(pk=day_id)
|
||||
except:
|
||||
return HttpResponse("This Day was not found")
|
||||
uploads = myday.upload_set.all()
|
||||
return render(request,'plan/show_day.html', {'uploads': uploads, 'day':myday,})
|
||||
|
||||
def show_SessionBearLakes(request,day):
|
||||
try:
|
||||
session=SessionBearLakes.objects.get(Day__DayNumber__exact=day)
|
||||
except:
|
||||
return HttpResponse("This Day was not found")
|
||||
return render(request,'plan/show_session_bearlakes.html', {'session': session,})
|
||||
|
||||
def show_SessionUssuriysk(request,day):
|
||||
try:
|
||||
session=SessionUssuriysk.objects.get(Day__DayNumber__exact=day)
|
||||
except:
|
||||
return HttpResponse("This Day was not found")
|
||||
session_lakes=session.Day.BearLakesDay
|
||||
return render(request,'plan/show_session_bearlakes.html', {'session': session_lakes,})
|
||||
|
||||
def update_SessionBearLakes(request,day):
|
||||
try:
|
||||
session=SessionBearLakes.objects.get(Day__DayNumber__exact=day)
|
||||
except:
|
||||
return HttpResponse("This Day was not found")
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
form = SessionBearLakesForm(request.POST,instance=session) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
new_form=form.save()
|
||||
return HttpResponseRedirect(new_form.get_absolute_url())
|
||||
else:
|
||||
return render(request,'plan/update_session_bearlakes.html', {'form':form,'session': session})
|
||||
else:
|
||||
form = SessionBearLakesForm(instance=session)
|
||||
return render(request,'plan/update_session_bearlakes.html', {'form':form,'session': session})
|
||||
|
||||
def update_SessionUssuriysk(request,day):
|
||||
try:
|
||||
session=SessionUssuriysk.objects.get(Day__DayNumber__exact=day)
|
||||
except:
|
||||
return HttpResponse("This Day was not found")
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
form = SessionUssuriyskForm(request.POST,instance=session) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
new_form=form.save()
|
||||
return HttpResponseRedirect(new_form.get_absolute_url())
|
||||
else:
|
||||
return render(request,'plan/update_session_ussuriysk.html', {'form':form,'session': session})
|
||||
else:
|
||||
form = SessionUssuriyskForm(instance=session)
|
||||
return render(request,'plan/update_session_ussuriysk.html', {'form':form,'session': session})
|
||||
|
||||
def login_username(request):
|
||||
if request.user.is_authenticated:
|
||||
try:
|
||||
user_profile=request.user.profile
|
||||
except:
|
||||
return HttpResponse("login: authenticated but no UserProfile.")
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
form = LoginUsernameForm(request.POST) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
username=form.clean_username()
|
||||
password=form.cleaned_data["password"]
|
||||
user = authenticate(username=username, password=password)
|
||||
if user is not None:
|
||||
if user.is_active:
|
||||
login(request, user)
|
||||
try:
|
||||
user_profile=user.profile
|
||||
except:
|
||||
form = UserProfileForm() # An unbound form
|
||||
return HttpResponse("login: authenticated but no UserProfile.")
|
||||
else:
|
||||
return HttpResponse("login: user account is not active.")
|
||||
else:
|
||||
form = LoginUsernameForm() # An unbound form
|
||||
return render(request,'plan/login.html', {'form':form, 'invalid_login': True})
|
||||
else:
|
||||
return HttpResponse("login: form is not valid.")
|
||||
else:
|
||||
form = LoginUsernameForm() # An unbound form
|
||||
return render(request,'plan/login.html', {'form':form})
|
||||
|
||||
all_bearlakes = SessionBearLakes.objects.all()
|
||||
return render(request,'plan/show_plan.html', {'bearlakes': all_bearlakes,'LaunchDate':LaunchDate})
|
||||
|
||||
|
||||
def logout_view(request):
|
||||
if request.user.is_authenticated:
|
||||
logout(request)
|
||||
return HttpResponse('<a class="button orange big" href="/plan/login">Login</a>')
|
||||
|
||||
def delete_upload(request, day_id, upload_id):
|
||||
if not request.user.is_authenticated:
|
||||
html = "<html><body>You have no rights to upload/delete documents. Please <a href='/plan/login'>login<>.</body></html>"
|
||||
return HttpResponseForbidden(html)
|
||||
try:
|
||||
user_profile=request.user.profile
|
||||
except:
|
||||
html = "<html><body>You have no user profile.</body></html>"
|
||||
return HttpResponseForbidden(html)
|
||||
try:
|
||||
myday=Day.objects.get(pk=day_id)
|
||||
except Day.DoesNotExist:
|
||||
raise Http404
|
||||
|
||||
# if mytarget.owner != user_profile:
|
||||
# html = "<html><body>You trying to delete presentation for someone else's target.</body></html>"
|
||||
# return HttpResponseForbidden(html)
|
||||
|
||||
try:
|
||||
upload=Upload.objects.get(pk=upload_id)
|
||||
except Upload.DoesNotExist:
|
||||
raise Http404
|
||||
|
||||
if upload.day != myday:
|
||||
html = "<html><body>Sorry, wrong day/upload pair.</body></html>"
|
||||
return HttpResponseForbidden(html)
|
||||
|
||||
upload.delete()
|
||||
return HttpResponseRedirect(myday.get_absolute_url())
|
||||
|
||||
def upload(request, day_id):
|
||||
|
||||
if not request.user.is_authenticated:
|
||||
html = "<html><body>You have no rights for this operation.</body></html>"
|
||||
return HttpResponseForbidden(html)
|
||||
|
||||
try:
|
||||
user_profile=request.user.profile
|
||||
except:
|
||||
html = "<html><body>You have no user profile.</body></html>"
|
||||
return HttpResponseForbidden(html)
|
||||
|
||||
try:
|
||||
myday=Day.objects.get(pk=day_id)
|
||||
except Day.DoesNotExist:
|
||||
raise Http404
|
||||
|
||||
if request.method == 'POST':
|
||||
form = UploadForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
upload = form.save(commit=False)
|
||||
upload.day = myday
|
||||
upload.owner = user_profile
|
||||
upload.filename = request.FILES['filefield'].name.encode('utf-8')
|
||||
upload.save()
|
||||
return HttpResponseRedirect(myday.get_absolute_url())
|
||||
else:
|
||||
form = UploadForm()
|
||||
|
||||
return render(request,'plan/upload.html',
|
||||
{'UserProfile':user_profile, 'form': form, 'day':myday}
|
||||
)
|
Reference in New Issue
Block a user