Quellcode durchsuchen

add CRUD for patient

MrOzOn vor 5 Jahren
Ursprung
Commit
399d723649

+ 0 - 0
apps/patient/__init__.py


+ 3 - 0
apps/patient/admin.py

@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.

+ 5 - 0
apps/patient/apps.py

@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class PatientConfig(AppConfig):
+    name = 'patient'

+ 30 - 0
apps/patient/migrations/0001_initial.py

@@ -0,0 +1,30 @@
+# Generated by Django 3.0.8 on 2020-07-23 08:19
+
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Patient',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False)),
+                ('name', models.CharField(max_length=50)),
+                ('avatar', models.ImageField(blank=True, null=True, upload_to='static/avatar/%Y/%m/%d/')),
+                ('created_date', models.DateTimeField(auto_now_add=True)),
+                ('owners', models.ManyToManyField(related_name='owners', to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+                'verbose_name': 'Пациент',
+                'verbose_name_plural': 'Пациенты',
+            },
+        ),
+    ]

+ 0 - 0
apps/patient/migrations/__init__.py


+ 18 - 0
apps/patient/models.py

@@ -0,0 +1,18 @@
+from django.contrib.auth.models import User
+from django.db import models
+
+
+class Patient(models.Model):
+    """ Модель (сущность) - Пациент """
+    id = models.AutoField(primary_key=True)
+    name = models.CharField(max_length=50)
+    avatar = models.ImageField(upload_to="static/avatar/%Y/%m/%d/", blank=True, null=True)
+    created_date = models.DateTimeField(auto_now_add=True)
+    owners = models.ManyToManyField(User,related_name='owners')
+
+    def __str__(self):
+        return "Пациент № %s - %s" % (self.id, self.name,)
+
+    class Meta:
+        verbose_name = "Пациент"
+        verbose_name_plural = "Пациенты"

+ 51 - 0
apps/patient/serializers.py

@@ -0,0 +1,51 @@
+from rest_framework import serializers, status
+from rest_framework.exceptions import ValidationError
+
+from apps.patient.models import Patient
+
+
+class PatientSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Patient
+        fields = '__all__'
+        extra_kwargs = {
+            'owners': {'required': False}
+        }
+
+    def create(self, validated_data):
+        user = self.context['request'].user
+        name = validated_data['name']
+        exists = Patient.objects.filter(owners=user).filter(name=name)
+        if len(exists) > 0:
+            raise ValidationError(detail="Patient with name "+name+" already exists", code=status.HTTP_400_BAD_REQUEST)
+        patient = Patient.objects.create(
+            name=validated_data['name']
+        )
+        patient.owners.set([user])
+        patient.save()
+        return patient
+
+    # def update(self, instance, validated_data):
+    #     if isinstance(instance, Patient):
+    #         if 'name' in validated_data:
+    #             instance.name = validated_data['name']
+    #         if 'owners' in validated_data:
+    #             result = instance.owners.all()
+    #             list_result = [entry for entry in result]
+    #             list_result.append(validated_data['owners'])
+    #             instance.owners.set(list_result)
+    #             # list_owner = instance.owners.all()
+    #             # list_owner.union(validated_data['owners'])
+    #             # listOwners.add(validated_data['owners'])
+    #             # instance.owners.set(instance.owners.all() | validated_data['owners']) #.add(validated_data['owners'])
+    #         instance.save()
+    #         return instance
+    #         # patient = (Patient)instance
+    #         # user = self.context['request'].user
+    #         # if user in instance.owners.all():
+    #         #     instance.name = validated_data['name']
+    #         #     instance.save()
+    #         #     return instance
+    #         # else:
+    #         #     raise ValidationError(detail="forbidden", code=status.HTTP_403_FORBIDDEN)
+    #     raise ValidationError(detail="incorrect input data", code=status.HTTP_400_BAD_REQUEST)

+ 3 - 0
apps/patient/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 74 - 0
apps/patient/views.py

@@ -0,0 +1,74 @@
+from django.core.exceptions import ObjectDoesNotExist
+from django.db.models import Model
+from django.shortcuts import render
+from rest_framework import viewsets, status
+from rest_framework.exceptions import ValidationError
+from rest_framework.generics import RetrieveUpdateDestroyAPIView, get_object_or_404
+from rest_framework.response import Response
+from rest_framework.views import APIView
+from django.contrib.auth.models import User
+
+from apps.patient.models import Patient
+from apps.patient.serializers import PatientSerializer
+
+
+class PatientViewSet(viewsets.ModelViewSet):
+
+    def get_queryset(self):
+        user = self.request.user
+        return Patient.objects.filter(owners=user)
+    # queryset = Patient.objects.all().order_by('-created_date')
+
+    # def get_object(self):
+    #     queryset = self.get_queryset()
+    #     filter = {}
+    #     for field in self.multiple_lookup_fields:
+    #         filter[field] = self.kwargs[field]
+    #
+    #     obj = get_object_or_404(queryset, **filter)
+    #     self.check_object_permissions(self.request, obj)
+    #     return obj
+
+    serializer_class = PatientSerializer
+
+
+# class PatientVS(RetrieveUpdateDestroyAPIView):
+#
+#     def get_queryset(self):
+#         user = self.request.user
+#
+#     def get(self, request, *args, **kwargs):
+#         user = request.user
+#         patients = Patient.objects.filter(owners=user)
+#         return patients
+
+
+class AddUserForPatient(APIView):
+
+    def post(self, request):
+        patient_id = request.data["patient_id"]
+        username = request.data["username"]
+        try:
+            patient = Patient.objects.get(pk=patient_id)
+        except ObjectDoesNotExist:
+            raise ValidationError(detail="incorrect patient_id",
+                                  code=status.HTTP_404_NOT_FOUND)
+        try:
+            user = User.objects.get(username=username)
+        except ObjectDoesNotExist:
+            raise ValidationError(detail="user not found",
+                                  code=status.HTTP_404_NOT_FOUND)
+        if request.user in patient.owners.all():
+            result = patient.owners.all()
+            list_result = [entry for entry in result]
+            list_result.append(user)
+            patient.owners.set(set(list_result))
+            patient.save()
+            serializer_context = {
+                'request': request,
+            }
+            serializer = PatientSerializer(patient, context=serializer_context)
+            return Response(serializer.data)
+        else:
+            raise ValidationError(detail="FORBIDDEN",
+                                  code=status.HTTP_403_FORBIDDEN)

+ 1 - 0
healthdiarybackend/settings.py

@@ -43,6 +43,7 @@ INSTALLED_APPS = [
     'django.contrib.staticfiles',
     'rest_framework',
     'rest_framework.authtoken',
+    'apps.patient',
 ]
 
 MIDDLEWARE = [

+ 5 - 1
healthdiarybackend/urls.py

@@ -18,13 +18,15 @@ from django.contrib import admin
 from django.urls import path, include
 from rest_framework import routers
 
+from apps.patient.models import Patient
 from apps.user import views as user_views
-from rest_framework.authtoken import views as authtoken_views
+from apps.patient import views as patient_views
 
 from apps.user.serializers import CustomAuthToken
 
 router = routers.DefaultRouter()
 router.register(r'users', user_views.UserViewSet)
+router.register(r'patients', patient_views.PatientViewSet, Patient)
 
 urlpatterns = [
     path('', include(router.urls)),
@@ -35,4 +37,6 @@ urlpatterns = [
 
     url('^register/', user_views.CreateUserView.as_view(), name='register-user'),
     url('^who-am-i/', user_views.CurrentUserView.as_view(), name='who-am-i'),
+    url('^add-user-to-patient/', patient_views.AddUserForPatient.as_view(), name='add-user-to-patient'),
+
 ]

+ 2 - 1
requirements.txt

@@ -1,2 +1,3 @@
 Django==3.0.8
-djangorestframework==3.11.0
+djangorestframework==3.11.0
+Pillow==7.2.0