Skip to content

Commit

Permalink
#29 backend: cleanup according to review
Browse files Browse the repository at this point in the history
  • Loading branch information
claasga committed Mar 21, 2024
1 parent 87e1322 commit e45bd14
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 104 deletions.
22 changes: 0 additions & 22 deletions backend/dps_training_k/configuration/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,25 +178,3 @@
"schedule": 1.0,
},
}

STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")

# Celery
# ------------------------------------------------------------------------------
# See: http://docs.celeryproject.org/en/latest/userguide/configuration.html
if USE_TZ:
CELERY_TIMEZONE = TIME_ZONE
CELERY_BROKER_URL = env.str("REDIS_URL", default="redis://localhost:6379")
CELERY_RESULT_BACKEND = "django-db"
CELERY_ACCEPT_CONTENT = ["json"]
CELERY_TASK_SERIALIZER = "json"
CELERY_RESULT_SERIALIZER = "json"
CELERY_TASK_TIME_LIMIT = 5 * 60 # TODO: Change if necessary
CELERY_TASK_SOFT_TIME_LIMIT = 60 # TODO: Change if necessary

CELERY_BEAT_SCHEDULE = {
"update_patients": {
"task": "game.tasks.check_for_updates",
"schedule": 1.0,
},
}
20 changes: 10 additions & 10 deletions backend/dps_training_k/game/consumers/trainer_consumer.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,19 +70,19 @@ def handle_test_passthrough(self):
)

def handle_start_exercise(self):
# Celery starten
# alle Objekte mit allen Zeittracks auf 0 starten
# Phasenübergänge schedulen
# über NestedEventable alles stoppen
# Start Celery
# Start all objects with zero time tracks
# Schedule phase transitions
# Stop everything using NestedEventable
pass

def handle_stop_exercise(self):
# Celery stoppen
# alle Objekte mit allen Zeittracks auf 0 stoppen
# Phasenübergänge stoppen
# Labor stoppen
# Maßnahmen stoppen
# über NestedEventable alles stoppen
# Stop Celery
# Stop all objects with all time tracks
# Stop phase transitions
# Stop laboratory
# Stop measures
# Stop everything using NestedEventable
pass

def handle_pause_exercise(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 5.0.1 on 2024-03-21 14:29

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('game', '0002_savedexercise_time_speed_up_owner_scheduledevent'),
]

operations = [
migrations.AlterModelOptions(
name='scheduledevent',
options={'ordering': ['exercise', 'end_date']},
),
migrations.RenameField(
model_name='scheduledevent',
old_name='date',
new_name='end_date',
),
]
4 changes: 2 additions & 2 deletions backend/dps_training_k/game/models/patient.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from django.db import models
from helpers.eventable import Eventable
from .exercise import Exercise
from .scheduled_event import ScheduledEvent


Expand All @@ -9,7 +8,7 @@ class Patient(Eventable, models.Model):
max_length=100, default="Max Mustermann"
) # technically patientData but kept here for simplicity for now
# patientID = models.ForeignKey() # currently called "SensenID"
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE)
exercise = models.ForeignKey("Exercise", on_delete=models.CASCADE)
# stateID = models.ForeignKey()
# measureID = models.ManyToManyField()
patientCode = models.IntegerField(
Expand All @@ -29,4 +28,5 @@ def schedule_temporary_event(self):
)

def temporary_event_test(self):
print("temporary_event_test called")
return True
15 changes: 8 additions & 7 deletions backend/dps_training_k/game/models/scheduled_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@

class ScheduledEvent(models.Model):
class Meta:
ordering = ["exercise", "date"]
ordering = ["exercise", "end_date"]

exercise = models.ForeignKey(
"Exercise",
on_delete=models.CASCADE,
related_name="events",
)
date = models.DateTimeField()
end_date = models.DateTimeField()
owner = models.OneToOneField(
"Owner",
on_delete=models.CASCADE,
Expand All @@ -24,15 +24,15 @@ class Meta:
def create_event(cls, exercise, t_sim_delta, method_name, patient=None, area=None):
cls.objects.create(
exercise=exercise,
date=cls.calculate_finish_time(t_sim_delta, exercise),
owner=Owner.create_owner(patient=patient, exercise=exercise),
end_date=cls.calculate_finish_time(t_sim_delta, exercise),
owner=Owner.create_owner(patient=patient, exercise=exercise, area=area),
method_name=method_name,
)

@classmethod
def calculate_finish_time(cls, t_sim_delta, exercise):
timedalta = timedelta(seconds=t_sim_delta * exercise.time_factor())
return settings.CURRENT_TIME() + timedalta
deltatime = timedelta(seconds=t_sim_delta * exercise.time_factor())
return settings.CURRENT_TIME() + deltatime

def action(self):
owner_instance = self.owner.owner_instance()
Expand All @@ -42,7 +42,7 @@ def action(self):

def __str__(self):
owner_instance = self.owner.owner_instance()
return f"ScheduledEvent #{self.id}, model name {owner_instance.__class__.__name__}, instance #{owner_instance}, exercise #{self.exercise}, trigger on: {self.date}"
return f"ScheduledEvent #{self.id}, model name {owner_instance.__class__.__name__}, instance #{owner_instance}, exercise #{self.exercise}, trigger on: {self.end_date}"


class Owner(models.Model):
Expand All @@ -65,6 +65,7 @@ class Owner(models.Model):

@classmethod
def create_owner(cls, patient=None, exercise=None, area=None):
# patient always needs to be checked before exercise, as exercise and patient are being passed when patient creates scheduled event
if patient:
return cls.objects.create(patient_owner=patient)
elif area:
Expand Down
5 changes: 3 additions & 2 deletions backend/dps_training_k/game/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
from game.models.scheduled_event import ScheduledEvent


# When this method is changed, the docker container needs to be rebuilt, because the
# Celery-worker doesn't get the update based on our docker configuration
@shared_task
def check_for_updates():
events = ScheduledEvent.objects.filter(date__lte=settings.CURRENT_TIME())
events = ScheduledEvent.objects.filter(end_date__lte=settings.CURRENT_TIME())
for event in events:
event.action()
return True
23 changes: 4 additions & 19 deletions backend/dps_training_k/game/tests/test_scheduler.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,11 @@
from django.test import TestCase
from django.conf import settings
from game.tests.factories import PatientFactory
from game.models import Patient, ScheduledEvent
from game.models import ScheduledEvent
from django.utils import timezone
from game.tasks import check_for_updates
import datetime
import logging

logger = logging.getLogger(__name__)


class TempEventTest:
def schedule_temporary_event(self):
ScheduledEvent.create_event(
self.exercise,
10,
"temporary_event_test",
patient=self,
)

def temporary_event_test(self):
return True
import time


class EventPatientTestCase(TestCase):
Expand All @@ -29,7 +14,7 @@ def timezoneFromTimestamp(self, timestamp):

def setUp(self):
self.patient = PatientFactory()
self.cache = settings.CURRENT_TIME
self.variable_backup = settings.CURRENT_TIME
settings.CURRENT_TIME = lambda: self.timezoneFromTimestamp(0)

def test_event_is_triggered(self):
Expand All @@ -44,4 +29,4 @@ def test_event_is_triggered(self):
self.assertEqual(ScheduledEvent.objects.count(), 0)

def tearDown(self):
settings.CURRENT_TIME = self.cache
settings.CURRENT_TIME = self.variable_backup
42 changes: 0 additions & 42 deletions backend/dps_training_k/helpers/eventable.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,3 @@
"""from django.db.models.base import ModelBase
from abc import ABCMeta, abstractmethod
# Create a new metaclass that inherits from both ModelBase and ABCMeta
class CustomModelBase(ABCMeta, ModelBase):
pass
"""

from abc import abstractmethod


Expand Down Expand Up @@ -35,36 +26,3 @@ class Eventable(AbstractEventable):
def remove_events(self):
for event in self.owned_events.all():
event.delete()


"""
class AbstractEventable:
@abstractmethod
def schedule_events(self):
pass
@abstractmethod
def remove_events(self):
pass
class NonEventable(AbstractEventable):
def schedule_events(self):
pass
def remove_events(self):
pass
class Eventable(AbstractEventable):
class Meta:
abstract = True
def remove_events(self):
for event in self.owned_events.all():
event.delete()
"""

0 comments on commit e45bd14

Please sign in to comment.