Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions AHC_app/AHC_app/celery_notifications/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
from celery.utils.log import get_task_logger
from django.conf import settings

from AHC_app.celery_notifications.utils.discord_utils import send_via_discord
from AHC_app.celery_notifications.utils.sending_utils import (
send_via_email, # , send_via_sms, send_via_discord
)
# from AHC_app.celery_notifications.utils.discord_utils import send_via_discord
from AHC_app.celery_notifications.utils.sending_utils import send_via_email

logger = get_task_logger(__name__)

Expand Down Expand Up @@ -44,6 +42,7 @@ def send_sms_notifications(**kwargs):

@shared_task(bind=True)
def send_discord_notifications(self, *args, **kwargs):
user_id = kwargs.get("user_id")
user_message = kwargs.get("user_message")
send_via_discord(user_id, user_message)
# user_id = kwargs.get("user_id")
# user_message = kwargs.get("user_message")
# send_via_discord(user_id, user_message)
pass
3 changes: 2 additions & 1 deletion AHC_app/AHC_app/celery_notifications/utils/discord_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
from discord.ext import commands
from django.conf import settings

TOKEN = settings.DISCORD_TOKEN
# TOKEN = settings.DISCORD_TOKEN
TOKEN = "none"


def send_via_discord(user_id: int, user_message: str) -> None:
Expand Down
10 changes: 10 additions & 0 deletions AHC_app/Dockerfile-queue
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM python:3.12
LABEL authors="AM"
WORKDIR /app
COPY Pipfile Pipfile.lock ./

RUN python -m pip install --upgrade pip && \
pip install --no-cache-dir pipenv && \
pipenv install --dev --system --deploy

COPY . .
File renamed without changes.
2 changes: 1 addition & 1 deletion AHC_app/animals/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ class AnimalsConfig(AppConfig):
name = "animals"

def ready(self):
import animals.signals
pass
19 changes: 5 additions & 14 deletions AHC_app/animals/signals.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
import os

from animals.models import Animal
from django.db.models.signals import post_delete, post_save, pre_delete
from django.dispatch import receiver
from users.models import Profile

from animals.models import Animal


@receiver(post_save, sender=Animal)
def remove_old_pictures_after_change(sender, instance, **kwargs):
animals_with_profile_images = Animal.objects.exclude(profile_image="").values_list(
"profile_image", flat=True
)
animals_with_profile_images = Animal.objects.exclude(profile_image="").values_list("profile_image", flat=True)
unused_images = os.listdir("static/media/profile_pics/animals/")

animals_with_profile_images = [
str(picture).split("/")[-1] for picture in animals_with_profile_images
]
animals_with_profile_images = [str(picture).split("/")[-1] for picture in animals_with_profile_images]

for image_name in unused_images:
if image_name not in animals_with_profile_images:
Expand All @@ -36,14 +31,10 @@ def remove_old_pictures_after_animal_delete(sender, instance, **kwargs):

@receiver(post_delete, sender=Profile)
def remove_old_pictures_after_user_delete(sender, instance, **kwargs):
animals_with_profile_images = Animal.objects.exclude(profile_image="").values_list(
"profile_image", flat=True
)
animals_with_profile_images = Animal.objects.exclude(profile_image="").values_list("profile_image", flat=True)
unused_images = os.listdir("static/media/profile_pics/animals/")

animals_with_profile_images = [
str(picture).split("/")[-1] for picture in animals_with_profile_images
]
animals_with_profile_images = [str(picture).split("/")[-1] for picture in animals_with_profile_images]

for image_name in unused_images:
if image_name not in animals_with_profile_images:
Expand Down
19 changes: 5 additions & 14 deletions AHC_app/animals/utils_owner/forms.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from datetime import date

from animals.models import Animal
from django import forms
from PIL import Image
from users.models import Profile

from animals.models import Animal


class ImageUploadForm(forms.ModelForm):
ALLOWED_EXTENSIONS = ["jpg", "jpeg", "png"]
Expand Down Expand Up @@ -38,9 +37,7 @@ def clean_profile_image(self):


class ChangeOwnerForm(forms.Form):
new_owner = forms.CharField(
max_length=255, required=True, label="New owner's profile name"
)
new_owner = forms.CharField(max_length=255, required=True, label="New owner's profile name")
set_keeper = forms.BooleanField(required=False, label="Set as keeper")

def __init__(self, *args, **kwargs):
Expand All @@ -63,9 +60,7 @@ def clean_new_owner(self):


class ManageKeepersForm(forms.Form):
input_user = forms.CharField(
max_length=255, required=True, label="Full keeper profile name"
)
input_user = forms.CharField(max_length=255, required=True, label="Full keeper profile name")

def __init__(self, *args, **kwargs):
self.instance = kwargs.pop("instance", None)
Expand All @@ -75,9 +70,7 @@ def clean_input_user(self):
input_user = self.cleaned_data.get("input_user")

if input_user == self.instance.owner.user.username:
raise forms.ValidationError(
"As the owner you can not set yourself as a keeper."
)
raise forms.ValidationError("As the owner you can not set yourself as a keeper.")

if input_user in self.instance.allowed_users.all():
raise forms.ValidationError("User is already on the list of keepers.")
Expand All @@ -101,9 +94,7 @@ def clean_birthdate(self):
current_date = date.today()

if birthdate > current_date:
raise forms.ValidationError(
"Date could not be set further than current day."
)
raise forms.ValidationError("Date could not be set further than current day.")

return birthdate

Expand Down
12 changes: 9 additions & 3 deletions AHC_app/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
version: "3.9"
services:
web:
build: .
build:
context: .
dockerfile: Dockerfile-web
image: ahc_app-web:latest
ports:
- "8000:8000"
Expand All @@ -16,7 +18,7 @@ services:
condition: service_healthy
environment:
- PYTHONUNBUFFERED=1
- PYTHONPATH=/AHC_app
- PYTHONPATH=/app
entrypoint: ["/bin/bash", "-c"]
command:
- |
Expand Down Expand Up @@ -71,7 +73,9 @@ services:
restart: always

queue:
build: .
build:
context: .
dockerfile: Dockerfile-queue
command: celery -A AHC_app.celery_notifications.config:celery_obj worker -l info
depends_on:
redis:
Expand All @@ -84,6 +88,8 @@ services:
- "5000:5000"
environment:
- DJANGO_SETTINGS_MODULE=AHC_app.settings
- PYTHONUNBUFFERED=1
- PYTHONPATH=/app

redis:
image: redis:7-alpine
Expand Down
1 change: 0 additions & 1 deletion AHC_app/homepage/admin.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.contrib import admin

from homepage.models import AnimalTitle, CronJob

admin.site.register(AnimalTitle)
Expand Down
4 changes: 1 addition & 3 deletions AHC_app/homepage/management/commands/sync_cronjobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ class Command(BaseCommand):
help = "Sync cronjobs with the actual cron configuration"

def handle(self, *args, **options):
cronjob_info = subprocess.run(
["crontab", "-l"], stdout=subprocess.PIPE, text=True
).stdout.splitlines()
cronjob_info = subprocess.run(["crontab", "-l"], stdout=subprocess.PIPE, text=True).stdout.splitlines()

CronJob.objects.all().delete()

Expand Down
2 changes: 1 addition & 1 deletion AHC_app/homepage/tests/test_homepage.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def test_should_return_status_code_200_when_view_is_get_called(self):
actual_status_code = resp.status_code

# assert actual_status_code == expected_status_code
self.assertEquals(expected_status_code, actual_status_code)
self.assertEqual(expected_status_code, actual_status_code)

def test_should_return_valid_render_template_name_when_view_is_get_called(self):
expected_template_name = "homepage/homepage.html"
Expand Down
1 change: 0 additions & 1 deletion AHC_app/homepage/urls.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.urls import path

from homepage.views import HomepageView

urlpatterns = [
Expand Down
2 changes: 0 additions & 2 deletions AHC_app/medical_notes/forms.py
Original file line number Diff line number Diff line change
@@ -1,2 +0,0 @@
from medical_notes.forms.type_basic_note import *
from medical_notes.forms.type_measurement_notes import *
4 changes: 1 addition & 3 deletions AHC_app/medical_notes/signals/type_feeding_notes.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,5 @@
def clean_orphaned_diet_records(sender, instance, **kwargs):
user_profile = UserProfile.objects.get(id=instance.related_note.author.id)
with transaction.atomic():
orphaned_notes = FeedingNote.objects.filter(
author=user_profile, related_note=None
)
orphaned_notes = FeedingNote.objects.filter(author=user_profile, related_note=None)
orphaned_notes.delete()
8 changes: 2 additions & 6 deletions AHC_app/medical_notes/signals/type_measurement_notes.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,13 @@ def validate_one_to_one_fields(sender, instance, **kwargs):
)
> 1
):
raise ValidationError(
"BiometricRecord can only have one of OneToOneFields assigned."
)
raise ValidationError("BiometricRecord can only have one of OneToOneFields assigned.")


@receiver(post_save, sender=BiometricRecord)
def clean_orphaned_metric_records(sender, instance, **kwargs):
user_profile = UserProfile.objects.get(id=instance.related_note.author.id)
medical_records = MedicalRecord.objects.filter(
author=user_profile, type_of_event="biometric_record"
)
medical_records = MedicalRecord.objects.filter(author=user_profile, type_of_event="biometric_record")

for record in medical_records:
if not record.biometricrecord_set.filter(
Expand Down
8 changes: 2 additions & 6 deletions AHC_app/medical_notes/views/type_measurement_notes.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,7 @@ def form_valid(self, form):
if record_type == "weight":
weight = form.cleaned_data["weight"]
unit = form.cleaned_data["weight_unit_to_present"]
weight_record = BiometricWeightRecords.objects.create(
weight=weight, weight_unit_to_present=unit
)
weight_record = BiometricWeightRecords.objects.create(weight=weight, weight_unit_to_present=unit)
biometric_record = BiometricRecord.objects.create(
animal=animal,
related_note=related_note,
Expand All @@ -44,9 +42,7 @@ def form_valid(self, form):
elif record_type == "height":
height = form.cleaned_data["height"]
unit = form.cleaned_data["height_unit_to_present"]
height_record = BiometricHeightRecords.objects.create(
height=height, height_unit_to_present=unit
)
height_record = BiometricHeightRecords.objects.create(height=height, height_unit_to_present=unit)
biometric_record = BiometricRecord.objects.create(
animal=animal,
related_note=related_note,
Expand Down
3 changes: 1 addition & 2 deletions AHC_app/users/admin.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.contrib import admin

from .models import Profile
from users.models import Profile

admin.site.register(Profile)
3 changes: 1 addition & 2 deletions AHC_app/users/forms.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from django import forms
from django.contrib.auth.forms import User, UserCreationForm

from .models import Profile
from users.models import Profile


class UserRegisterForm(UserCreationForm):
Expand Down
11 changes: 3 additions & 8 deletions AHC_app/users/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from homepage.models import Privilege, ProfileBackground

from .models import Profile
from users.models import Profile


@receiver(pre_save, sender=Profile)
Expand All @@ -16,18 +15,14 @@ def create_basic_privilege(sender, instance, **kwargs):
@receiver(pre_save, sender=Profile)
def create_background(sender, instance, **kwargs):
if not instance.profile_background:
background, _ = ProfileBackground.objects.get_or_create(
title="Default Background"
)
background, _ = ProfileBackground.objects.get_or_create(title="Default Background")
instance.profile_background = background


@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
background, _ = ProfileBackground.objects.get_or_create(
title="Default Background"
)
background, _ = ProfileBackground.objects.get_or_create(title="Default Background")
Profile.objects.create(user=instance)


Expand Down
33 changes: 26 additions & 7 deletions AHC_app/users/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,37 @@
PasswordResetView,
)
from django.urls import path

from . import views as user_views
from users import views as user_views

urlpatterns = [
path("", auth_views.LoginView.as_view(template_name="users/login.html"), name="login"),
path("login/", auth_views.LoginView.as_view(template_name="users/login.html"), name="login"),
path("register/", user_views.UserRegisterView.as_view(), name="register"),
path("login_success/", auth_views.LoginView.as_view(template_name="users/login_success.html"), name="login_success"),
path(
"login_success/", auth_views.LoginView.as_view(template_name="users/login_success.html"), name="login_success"
),
path("logout/", auth_views.LogoutView.as_view(template_name="users/logout.html"), name="logout"),
path("profile/", user_views.UserProfileView.as_view(), name="profile"),
path("password-reset/", PasswordResetView.as_view(template_name="users/password_reset.html", html_email_template_name="users/password_reset_email.html"), name="password-reset"),
path("password-reset/done/", PasswordResetDoneView.as_view(template_name="users/password_reset_done.html"), name="password_reset_done"),
path("password-reset-confirm/<uidb64>/<token>/", PasswordResetConfirmView.as_view(template_name="users/password_reset_confirm.html"), name="password_reset_confirm"),
path("password-reset-complete/", PasswordResetCompleteView.as_view(template_name="users/password_reset_complete.html"), name="password_reset_complete"),
path(
"password-reset/",
PasswordResetView.as_view(
template_name="users/password_reset.html", html_email_template_name="users/password_reset_email.html"
),
name="password-reset",
),
path(
"password-reset/done/",
PasswordResetDoneView.as_view(template_name="users/password_reset_done.html"),
name="password_reset_done",
),
path(
"password-reset-confirm/<uidb64>/<token>/",
PasswordResetConfirmView.as_view(template_name="users/password_reset_confirm.html"),
name="password_reset_confirm",
),
path(
"password-reset-complete/",
PasswordResetCompleteView.as_view(template_name="users/password_reset_complete.html"),
name="password_reset_complete",
),
]
7 changes: 3 additions & 4 deletions AHC_app/users/views.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views.generic import CreateView, FormView, UpdateView

from .forms import ProfileUpdateForm, UserRegisterForm, UserUpdateForm
from .models import Profile
from django.views.generic import CreateView, UpdateView
from users.forms import ProfileUpdateForm, UserRegisterForm, UserUpdateForm
from users.models import Profile


class UserRegisterView(CreateView):
Expand Down
1 change: 0 additions & 1 deletion kubernetes/queue/celery/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ spec:
image: ahc_app-queue:latest
imagePullPolicy: Never
command: [ "celery", "-A", "AHC_app.celery_notifications.config:celery_obj", "worker", "-l", "info"]
# command: [ "sleep", "infinity" ] # debug
env:
- name: PYTHONUNBUFFERED
value: "1"
Expand Down
Loading