Crew replication, etc.
This commit is contained in:
parent
37c10284f1
commit
82fa6d445e
13 changed files with 182 additions and 13 deletions
0
core/helpers/__init__.py
Normal file
0
core/helpers/__init__.py
Normal file
0
core/helpers/adonis.py
Normal file
0
core/helpers/adonis.py
Normal file
5
core/helpers/uploads.py
Normal file
5
core/helpers/uploads.py
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
def get_upload_path(instance, filename):
|
||||||
|
return f"{str(uuid.uuid4)}/{filename}"
|
16
core/migrations/0009_delete_vesselalias.py
Normal file
16
core/migrations/0009_delete_vesselalias.py
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# Generated by Django 4.1.1 on 2022-09-22 14:58
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0008_vesselalias'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='VesselAlias',
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Generated by Django 4.1.1 on 2022-09-22 15:22
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0009_delete_vesselalias'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Course',
|
||||||
|
fields=[
|
||||||
|
('id', models.IntegerField(primary_key=True, serialize=False)),
|
||||||
|
('title', models.CharField(max_length=256)),
|
||||||
|
('shortcode', models.CharField(max_length=64)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CrewMember',
|
||||||
|
fields=[
|
||||||
|
('pin', models.IntegerField(primary_key=True, serialize=False)),
|
||||||
|
('first_name', models.CharField(max_length=256)),
|
||||||
|
('last_name', models.CharField(max_length=256)),
|
||||||
|
('email', models.EmailField(max_length=254)),
|
||||||
|
('dob', models.DateField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Moodle',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=64)),
|
||||||
|
('url', models.URLField()),
|
||||||
|
('monitor', models.BooleanField(default=True)),
|
||||||
|
('backup', models.BooleanField(default=False)),
|
||||||
|
('vessel', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='core.vessel')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='MoodleDatabase',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('host', models.CharField(max_length=256)),
|
||||||
|
('username', models.CharField(max_length=256)),
|
||||||
|
('password', models.CharField(max_length=256)),
|
||||||
|
('database', models.CharField(default='moodle', max_length=256)),
|
||||||
|
('instance', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='core.moodle')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CourseAssignment',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.course')),
|
||||||
|
('crew', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.crewmember')),
|
||||||
|
('instance', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.moodle')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,36 @@
|
||||||
|
# Generated by Django 4.1.1 on 2022-09-22 15:43
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('core', '0010_course_crewmember_moodle_moodledatabase_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='MoodlePlugin',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=128)),
|
||||||
|
('section', models.CharField(max_length=16)),
|
||||||
|
('current_version', models.IntegerField()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='replicationtarget',
|
||||||
|
name='monitor',
|
||||||
|
field=models.BooleanField(default=True),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CourseAssignmentLog',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('assignment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.courseassignment')),
|
||||||
|
('instance', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.moodle')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,3 +1,6 @@
|
||||||
from .auth import User, OTPSession
|
from .auth import User, OTPSession
|
||||||
from .vessel import Vessel
|
from .vessel import Vessel
|
||||||
from .replication import ReplicationFile, ReplicationFileLog, ReplicationSource, ReplicationTarget
|
from .replication import ReplicationFile, ReplicationFileLog, ReplicationSource, ReplicationTarget
|
||||||
|
from .course import Course
|
||||||
|
from .crew import CrewMember
|
||||||
|
from .moodle import Moodle, MoodleDatabase
|
|
@ -1,3 +1,6 @@
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
class Course(models.Model):
|
class Course(models.Model):
|
||||||
id = models.IntegerField(primary_key=True)
|
id = models.IntegerField(primary_key=True)
|
||||||
title = models.CharField(max_length=256)
|
title = models.CharField(max_length=256)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
from .course import Course
|
from ..helpers.uploads import get_upload_path
|
||||||
from .vessel import Vessel
|
|
||||||
|
|
||||||
|
|
||||||
class CrewMember(models.Model):
|
class CrewMember(models.Model):
|
||||||
|
@ -11,8 +11,14 @@ class CrewMember(models.Model):
|
||||||
email = models.EmailField()
|
email = models.EmailField()
|
||||||
dob = models.DateField()
|
dob = models.DateField()
|
||||||
|
|
||||||
|
profile_picture = models.ImageField(upload_to=get_upload_path)
|
||||||
|
|
||||||
class CourseAssignment(models.Model):
|
expiry = models.DateTimeField(null=True, blank=True)
|
||||||
crew = models.ForeignKey(CrewMember, models.CASCADE)
|
|
||||||
course = models.ForeignKey(Course, models.CASCADE)
|
@classmethod
|
||||||
vessel = models.ForeignKey(Vessel, models.CASCADE, null=True)
|
def get_or_import(cls, pin):
|
||||||
|
try:
|
||||||
|
found = cls.objects.get(pin=pin)
|
||||||
|
|
||||||
|
if found.expiry and found.expiry < timezone.now():
|
||||||
|
pass
|
41
core/models/moodle.py
Normal file
41
core/models/moodle.py
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
from django.db import models
|
||||||
|
from django import forms
|
||||||
|
|
||||||
|
from .vessel import Vessel
|
||||||
|
from .crew import CrewMember
|
||||||
|
from .course import Course
|
||||||
|
|
||||||
|
|
||||||
|
class Moodle(models.Model):
|
||||||
|
vessel = models.OneToOneField(Vessel, models.CASCADE)
|
||||||
|
name = models.CharField(max_length=Vessel.name.field.max_length)
|
||||||
|
url = models.URLField()
|
||||||
|
|
||||||
|
monitor = models.BooleanField(default=True)
|
||||||
|
backup = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
|
||||||
|
class MoodleDatabase(models.Model):
|
||||||
|
instance = models.OneToOneField(Moodle, models.CASCADE)
|
||||||
|
host = models.CharField(max_length=256)
|
||||||
|
username = models.CharField(max_length=256)
|
||||||
|
password = models.CharField(max_length=256)
|
||||||
|
database = models.CharField(max_length=256, default="moodle")
|
||||||
|
|
||||||
|
|
||||||
|
class MoodlePlugin(models.Model):
|
||||||
|
name = models.CharField(max_length=128)
|
||||||
|
section = models.CharField(max_length=16)
|
||||||
|
current_version = models.IntegerField()
|
||||||
|
|
||||||
|
|
||||||
|
class CourseAssignment(models.Model):
|
||||||
|
crew = models.ForeignKey(CrewMember, models.CASCADE)
|
||||||
|
course = models.ForeignKey(Course, models.CASCADE)
|
||||||
|
instance = models.ForeignKey(Moodle, models.CASCADE, null=True)
|
||||||
|
|
||||||
|
|
||||||
|
class CourseAssignmentLog(models.Model):
|
||||||
|
assignment = models.ForeignKey(CourseAssignment, models.CASCADE)
|
||||||
|
instance = models.ForeignKey(Moodle, models.CASCADE)
|
||||||
|
timestamp = models.DateTimeField(auto_now_add=True)
|
|
@ -26,6 +26,7 @@ class ReplicationTarget(models.Model):
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
address = models.CharField(max_length=256)
|
address = models.CharField(max_length=256)
|
||||||
username = models.CharField(max_length=64, default=getuser(), null=True, blank=True)
|
username = models.CharField(max_length=64, default=getuser(), null=True, blank=True)
|
||||||
|
monitor = models.BooleanField(default=True)
|
||||||
|
|
||||||
def to_vessel(self, dbclass=None) -> Vessel:
|
def to_vessel(self, dbclass=None) -> Vessel:
|
||||||
return Vessel(name, address, username, dbclass=ContentMonsterDatabase)
|
return Vessel(name, address, username, dbclass=ContentMonsterDatabase)
|
||||||
|
|
|
@ -50,8 +50,3 @@ class Vessel(models.Model):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return ship
|
return ship
|
||||||
|
|
||||||
|
|
||||||
class VesselAlias(models.Model):
|
|
||||||
vessel = models.ForeignKey(Vessel, models.CASCADE)
|
|
||||||
alias = models.CharField(max_length=64)
|
|
||||||
|
|
Loading…
Reference in a new issue