diff --git a/Rasaddam_Backend/settings.py b/Rasaddam_Backend/settings.py index 8674c70..969fd7b 100644 --- a/Rasaddam_Backend/settings.py +++ b/Rasaddam_Backend/settings.py @@ -45,9 +45,15 @@ INSTALLED_APPS = [ 'rest_framework_simplejwt', 'apps.authentication.apps.AuthenticationConfig', 'apps.authorization.apps.AuthorizationConfig', + 'apps.captcha_app.apps.CaptchaAppConfig', + 'apps.core.apps.CoreConfig', + 'apps.herd.apps.HerdAppConfig', + 'apps.livestock.apps.LivestockConfig', + 'apps.pos_machine.apps.PosMachineConfig', + 'apps.tag.apps.TagConfig', + 'apps.warehouse.apps.WarehouseConfig', 'rest_captcha', 'captcha', - 'apps.captcha_app.apps.CaptchaAppConfig' ] MIDDLEWARE = [ @@ -108,7 +114,7 @@ REST_FRAMEWORK = { } SIMPLE_JWT = { - "ACCESS_TOKEN_LIFETIME": timedelta(minutes=5), + "ACCESS_TOKEN_LIFETIME": timedelta(days=1), "REFRESH_TOKEN_LIFETIME": timedelta(days=1), "ROTATE_REFRESH_TOKENS": False, "BLACKLIST_AFTER_ROTATION": False, diff --git a/Rasaddam_Backend/urls.py b/Rasaddam_Backend/urls.py index 84ddeda..665177c 100644 --- a/Rasaddam_Backend/urls.py +++ b/Rasaddam_Backend/urls.py @@ -21,4 +21,5 @@ urlpatterns = [ path('admin/', admin.site.urls), path('auth/', include('apps.authentication.urls')), path('', include('apps.captcha_app.api.v1.urls')), + path('', include('apps.core.urls')), ] diff --git a/apps/authentication/api/v1/api.py b/apps/authentication/api/v1/api.py index 2b0a2b7..0ae2dda 100644 --- a/apps/authentication/api/v1/api.py +++ b/apps/authentication/api/v1/api.py @@ -1,4 +1,5 @@ from apps.authentication.api.v1.serializers.jwt import CustomizedTokenObtainPairSerializer +from rest_framework_simplejwt.authentication import JWTAuthentication from rest_framework_simplejwt.views import TokenObtainPairView from rest_framework.viewsets import ModelViewSet from rest_framework.decorators import action @@ -10,10 +11,12 @@ class CustomizedTokenObtainPairView(TokenObtainPairView): serializer_class = CustomizedTokenObtainPairSerializer +# Example Code class Authentication(ModelViewSet): queryset = User serializer_class = '' permission_classes = '' + authentication_classes = [JWTAuthentication] @action( methods=['post', ], diff --git a/apps/authentication/api/v1/serializers/jwt.py b/apps/authentication/api/v1/serializers/jwt.py index 8d9679a..5a7ad51 100644 --- a/apps/authentication/api/v1/serializers/jwt.py +++ b/apps/authentication/api/v1/serializers/jwt.py @@ -2,6 +2,7 @@ from rest_framework_simplejwt.serializers import TokenObtainPairSerializer from apps.captcha_app import exceptions as captcha_exception from rest_framework_simplejwt.settings import api_settings from django.contrib.auth.models import update_last_login +from apps.authentication.models import User from rest_framework import exceptions from django.core.cache import cache from typing import Any @@ -51,9 +52,12 @@ class CustomizedTokenObtainPairSerializer(TokenObtainPairSerializer): # noqa token = super().get_token(user) + # get customized user + auth_user_model = User.objects.get(username=user.username) + # Add custom claims token['name'] = user.username - token['mobile'] = user.mobile - token['national_code'] = user.national_code + token['mobile'] = auth_user_model.mobile + token['national_code'] = auth_user_model.national_code return token diff --git a/apps/authentication/migrations/0005_user_address_user_birthdate_user_nationality_and_more.py b/apps/authentication/migrations/0005_user_address_user_birthdate_user_nationality_and_more.py new file mode 100644 index 0000000..ea85bc6 --- /dev/null +++ b/apps/authentication/migrations/0005_user_address_user_birthdate_user_nationality_and_more.py @@ -0,0 +1,43 @@ +# Generated by Django 4.2.20 on 2025-05-05 07:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0004_user_otp_status'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='address', + field=models.TextField(max_length=1000, null=True), + ), + migrations.AddField( + model_name='user', + name='birthdate', + field=models.DateTimeField(null=True), + ), + migrations.AddField( + model_name='user', + name='nationality', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='user', + name='ownership', + field=models.IntegerField(default=1, help_text='number 1 is natural & number 2 is legal'), + ), + migrations.AddField( + model_name='user', + name='phone', + field=models.CharField(max_length=18, null=True), + ), + migrations.AlterField( + model_name='user', + name='photo', + field=models.CharField(max_length=50, null=True), + ), + ] diff --git a/apps/authentication/migrations/0006_remove_user_ownership.py b/apps/authentication/migrations/0006_remove_user_ownership.py new file mode 100644 index 0000000..44940d2 --- /dev/null +++ b/apps/authentication/migrations/0006_remove_user_ownership.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.20 on 2025-05-05 08:20 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0005_user_address_user_birthdate_user_nationality_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='user', + name='ownership', + ), + ] diff --git a/apps/authentication/migrations/0007_user_ownership.py b/apps/authentication/migrations/0007_user_ownership.py new file mode 100644 index 0000000..34a937c --- /dev/null +++ b/apps/authentication/migrations/0007_user_ownership.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.20 on 2025-05-05 08:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0006_remove_user_ownership'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='ownership', + field=models.CharField(choices=[('N', 'Natural'), ('L', 'Legal')], default='N', help_text='N is natural & L is legal', max_length=1), + ), + ] diff --git a/apps/authentication/models.py b/apps/authentication/models.py index d3fc21e..dddec0a 100644 --- a/apps/authentication/models.py +++ b/apps/authentication/models.py @@ -7,8 +7,22 @@ from apps.core.models import BaseModel class User(AbstractUser, BaseModel): mobile = models.CharField(max_length=18) + phone = models.CharField(max_length=18, null=True) national_code = models.CharField(max_length=16) - photo = models.CharField(max_length=50) + birthdate = models.DateTimeField(null=True) + nationality = models.CharField(max_length=20, null=True) + ownership_types = ( + ('N', 'Natural'), + ('L', 'Legal') + ) + ownership = models.CharField( + max_length=1, + choices=ownership_types, + default='N', + help_text="N is natural & L is legal" + ) + address = models.TextField(max_length=1000, null=True) + photo = models.CharField(max_length=50, null=True) province = models.ForeignKey( 'Province', on_delete=models.CASCADE, diff --git a/apps/captcha_app/api/v1/views.py b/apps/captcha_app/api/v1/views.py index 3631088..2f3e894 100644 --- a/apps/captcha_app/api/v1/views.py +++ b/apps/captcha_app/api/v1/views.py @@ -22,9 +22,7 @@ class CustomizeRestCaptchaView(views.APIView): key = str(uuid.uuid4()) value = random_char_challenge(settings.CAPTCHA_LENGTH) cache_key = utils.get_cache_key(key) - print(cache_key) cache.set(cache_key, value, settings.CAPTCHA_TIMEOUT) - print(cache.get(cache_key)) # generate image image_bytes = generate_image(value) @@ -37,7 +35,3 @@ class CustomizeRestCaptchaView(views.APIView): 'image_decode': 'base64' } return response.Response(data) - - def get(self, request): - key = cache.get("rest_captcha_9e3ca166-c2f8-41e8-8f19-aa6f520fc123.0") - return response.Response(key) diff --git a/apps/core/api.py b/apps/core/api.py new file mode 100644 index 0000000..d61f64d --- /dev/null +++ b/apps/core/api.py @@ -0,0 +1,9 @@ +from rest_framework import viewsets +from apps.core.models import MobileTest +from rest_framework.response import Response +from apps.core.serializers import MobileTestSerializer + + +class MobileTestViewSet(viewsets.ModelViewSet): + queryset = MobileTest.objects.all() + serializer_class = MobileTestSerializer diff --git a/apps/core/migrations/0001_initial.py b/apps/core/migrations/0001_initial.py new file mode 100644 index 0000000..875bee6 --- /dev/null +++ b/apps/core/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# Generated by Django 4.2.20 on 2025-05-05 11:41 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='MobileTest', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('latitude', models.DecimalField(decimal_places=16, max_digits=22)), + ('longitude', models.DecimalField(decimal_places=16, max_digits=22)), + ('count', models.IntegerField(default=0)), + ('time', models.DateTimeField(auto_now_add=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/pos/__init__.py b/apps/core/migrations/__init__.py similarity index 100% rename from apps/pos/__init__.py rename to apps/core/migrations/__init__.py diff --git a/apps/core/models.py b/apps/core/models.py index 7933092..e6cf610 100644 --- a/apps/core/models.py +++ b/apps/core/models.py @@ -23,3 +23,10 @@ class BaseModel(models.Model): class Meta: abstract = True + + +class MobileTest(BaseModel): + latitude = models.DecimalField(max_digits=22, decimal_places=16) + longitude = models.DecimalField(max_digits=22, decimal_places=16) + count = models.IntegerField(default=0) + time = models.DateTimeField(auto_now_add=True) diff --git a/apps/core/serializers.py b/apps/core/serializers.py new file mode 100644 index 0000000..41b7848 --- /dev/null +++ b/apps/core/serializers.py @@ -0,0 +1,8 @@ +from apps.core.models import MobileTest +from rest_framework import serializers + + +class MobileTestSerializer(serializers.ModelSerializer): + class Meta: + model = MobileTest + fields = '__all__' diff --git a/apps/core/urls.py b/apps/core/urls.py index a87018c..84bad30 100644 --- a/apps/core/urls.py +++ b/apps/core/urls.py @@ -1,3 +1,11 @@ +from rest_framework.routers import DefaultRouter +from apps.core.api import MobileTestViewSet +from django.urls import path, include + +router = DefaultRouter() +router.register('mobile_test', MobileTestViewSet, basename='mobile_test') app_name = "core" -urlpatterns = [] +urlpatterns = [ + path('core/', include(router.urls)) +] diff --git a/apps/pos/api/v1/api.py b/apps/herd/__init__.py similarity index 100% rename from apps/pos/api/v1/api.py rename to apps/herd/__init__.py diff --git a/apps/pos/admin.py b/apps/herd/admin.py similarity index 100% rename from apps/pos/admin.py rename to apps/herd/admin.py diff --git a/apps/herd/apps.py b/apps/herd/apps.py new file mode 100644 index 0000000..754f8c8 --- /dev/null +++ b/apps/herd/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HerdAppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.herd' diff --git a/apps/pos/api/v1/serializers.py b/apps/herd/management/__init__.py similarity index 100% rename from apps/pos/api/v1/serializers.py rename to apps/herd/management/__init__.py diff --git a/apps/pos/api/v1/urls.py b/apps/herd/management/commands/__init__.py similarity index 100% rename from apps/pos/api/v1/urls.py rename to apps/herd/management/commands/__init__.py diff --git a/apps/herd/management/commands/command.py b/apps/herd/management/commands/command.py new file mode 100644 index 0000000..c68face --- /dev/null +++ b/apps/herd/management/commands/command.py @@ -0,0 +1 @@ +# Your custom management commands go here. diff --git a/apps/herd/migrations/0001_initial.py b/apps/herd/migrations/0001_initial.py new file mode 100644 index 0000000..b60897e --- /dev/null +++ b/apps/herd/migrations/0001_initial.py @@ -0,0 +1,46 @@ +# Generated by Django 4.2.20 on 2025-05-05 11:54 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0007_user_ownership'), + ] + + operations = [ + migrations.CreateModel( + name='Herd', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('name', models.CharField(max_length=50)), + ('photo', models.CharField(max_length=50, null=True)), + ('code', models.CharField(max_length=20)), + ('postal', models.CharField(help_text='herd postal code', max_length=10, null=True)), + ('institution', models.CharField(help_text='herd institution code', max_length=20, null=True)), + ('epidemiologic', models.CharField(max_length=18, null=True)), + ('latitude', models.DecimalField(decimal_places=16, max_digits=22, null=True)), + ('longitude', models.DecimalField(decimal_places=16, max_digits=22, null=True)), + ('unit_unique_id', models.CharField(max_length=20, null=True)), + ('activity', models.CharField(choices=[('I', 'Industrial'), ('V', 'Village'), ('N', 'Nomadic')], max_length=1, null=True)), + ('activity_state', models.BooleanField(default=False)), + ('operating_license_state', models.BooleanField(default=False)), + ('capacity', models.IntegerField(default=0)), + ('contractor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='herd_contractor', to='authentication.organization')), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/herd/migrations/__init__.py b/apps/herd/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/mobile/api/__init__.py b/apps/herd/mobile/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/mobile/api/v1/__init__.py b/apps/herd/mobile/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/mobile/api/v1/serializers.py b/apps/herd/mobile/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/mobile/api/v1/urls.py b/apps/herd/mobile/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/mobile/api/v1/views.py b/apps/herd/mobile/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/mobile/tests/test_common_services.py b/apps/herd/mobile/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/models.py b/apps/herd/models.py new file mode 100644 index 0000000..05978d8 --- /dev/null +++ b/apps/herd/models.py @@ -0,0 +1,46 @@ +from apps.core.models import BaseModel +from apps.authentication import models as auth_models +from django.db import models + + +class Herd(BaseModel): + name = models.CharField(max_length=50) + photo = models.CharField(max_length=50, null=True) + code = models.CharField(max_length=20) + postal = models.CharField( + max_length=10, + help_text="herd postal code", null=True + ) + institution = models.CharField( + max_length=20, + help_text="herd institution code", null=True + ) + epidemiologic = models.CharField(max_length=18, null=True) # noqa + contractor = models.ForeignKey( + auth_models.Organization, + on_delete=models.CASCADE, + related_name="herd_contractor", + null=True + ) + latitude = models.DecimalField(max_digits=22, decimal_places=16, null=True) + longitude = models.DecimalField(max_digits=22, decimal_places=16, null=True) + unit_unique_id = models.CharField(max_length=20, null=True) + activity_types = ( + ("I", "Industrial"), + ("V", "Village"), + ("N", "Nomadic") + ) + activity = models.CharField( + choices=activity_types, + max_length=1, + null=True + ) + activity_state = models.BooleanField(default=False) + operating_license_state = models.BooleanField(default=False) + capacity = models.IntegerField(default=0) + + def __str__(self): + return f'{self.name}-{self.code}' + + def save(self, *args, **kwargs): + super(Herd, self).save(*args, **kwargs) diff --git a/apps/herd/permissions.py b/apps/herd/permissions.py new file mode 100644 index 0000000..25edb52 --- /dev/null +++ b/apps/herd/permissions.py @@ -0,0 +1,25 @@ +from rest_framework import permissions + + +# example Code +class AuthorAllStaffAllButEditOrReadOnly(permissions.BasePermission): + edit_methods = ("PUT", "PATCH") + + def has_permission(self, request, view): + if request.user.is_authenticated: + return True + + def has_object_permission(self, request, view, obj): + if request.user.is_superuser: + return True + + if request.method in permissions.SAFE_METHODS: + return True + + if obj.author == request.user: + return True + + if request.user.is_staff and request.method not in self.edit_methods: + return True + + return False diff --git a/apps/herd/pos/api/__init__.py b/apps/herd/pos/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/pos/api/v1/__init__.py b/apps/herd/pos/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/pos/api/v1/serializers.py b/apps/herd/pos/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/pos/api/v1/urls.py b/apps/herd/pos/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/pos/api/v1/views.py b/apps/herd/pos/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/pos/tests/test_common_services.py b/apps/herd/pos/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/services.py b/apps/herd/services.py new file mode 100644 index 0000000..93888af --- /dev/null +++ b/apps/herd/services.py @@ -0,0 +1 @@ +# Your services go here diff --git a/apps/herd/urls.py b/apps/herd/urls.py new file mode 100644 index 0000000..0865d84 --- /dev/null +++ b/apps/herd/urls.py @@ -0,0 +1 @@ +# Your urls go here diff --git a/apps/herd/web/api/__init__.py b/apps/herd/web/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/web/api/v1/__init__.py b/apps/herd/web/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/web/api/v1/serializers.py b/apps/herd/web/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/web/api/v1/urls.py b/apps/herd/web/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/web/api/v1/views.py b/apps/herd/web/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/herd/web/tests/test_common_services.py b/apps/herd/web/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/__init__.py b/apps/livestock/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/admin.py b/apps/livestock/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/apps/livestock/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/livestock/apps.py b/apps/livestock/apps.py new file mode 100644 index 0000000..e7e5889 --- /dev/null +++ b/apps/livestock/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LivestockConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.livestock' diff --git a/apps/livestock/management/__init__.py b/apps/livestock/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/management/commands/__init__.py b/apps/livestock/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/management/commands/command.py b/apps/livestock/management/commands/command.py new file mode 100644 index 0000000..c68face --- /dev/null +++ b/apps/livestock/management/commands/command.py @@ -0,0 +1 @@ +# Your custom management commands go here. diff --git a/apps/livestock/migrations/0001_initial.py b/apps/livestock/migrations/0001_initial.py new file mode 100644 index 0000000..1e38d98 --- /dev/null +++ b/apps/livestock/migrations/0001_initial.py @@ -0,0 +1,37 @@ +# Generated by Django 4.2.20 on 2025-05-05 11:54 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('herd', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='LiveStock', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('type', models.CharField(choices=[('L', 'Light'), ('H', 'Heavy')], max_length=1)), + ('species', models.CharField(choices=[], max_length=1)), + ('birthdate', models.DateTimeField(null=True)), + ('gender', models.IntegerField(choices=[(1, 'male'), (2, 'female')], default=1)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createdby', to=settings.AUTH_USER_MODEL)), + ('herd', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='live_stock_herd', to='herd.herd')), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/livestock/migrations/0002_initial.py b/apps/livestock/migrations/0002_initial.py new file mode 100644 index 0000000..bd001ff --- /dev/null +++ b/apps/livestock/migrations/0002_initial.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.20 on 2025-05-05 11:54 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('livestock', '0001_initial'), + ('tag', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='livestock', + name='tag', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='livestock_tag', to='tag.tag'), + ), + ] diff --git a/apps/livestock/migrations/__init__.py b/apps/livestock/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/mobile/api/__init__.py b/apps/livestock/mobile/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/mobile/api/v1/__init__.py b/apps/livestock/mobile/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/mobile/api/v1/serializers.py b/apps/livestock/mobile/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/mobile/api/v1/urls.py b/apps/livestock/mobile/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/mobile/api/v1/views.py b/apps/livestock/mobile/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/mobile/tests/test_common_services.py b/apps/livestock/mobile/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/models.py b/apps/livestock/models.py new file mode 100644 index 0000000..21e8a88 --- /dev/null +++ b/apps/livestock/models.py @@ -0,0 +1,40 @@ +from apps.core.models import BaseModel +from apps.herd import models as herd_models +from apps.tag import models as tag_models +from django.db import models + + +class LiveStock(BaseModel): + herd = models.ForeignKey( + herd_models.Herd, + on_delete=models.CASCADE, + related_name="live_stock_herd", + null=True + ) + tag = models.ForeignKey( + tag_models.Tag, + on_delete=models.CASCADE, + related_name='livestock_tag', + null=True + ) + types = ( + ('L', 'Light'), + ('H', 'Heavy') + ) + type = models.CharField(max_length=1, choices=types) + species_type = ( + () + ) + species = models.CharField(max_length=1, choices=species_type) + birthdate = models.DateTimeField(null=True) + gender_type = ( + (1, 'male'), + (2, 'female') + ) + gender = models.IntegerField(choices=gender_type, default=1) + + def __str__(self): + return f'{self.get_species_display()}-{self.get_type_display()}' + + def save(self, *args, **kwargs): + super(LiveStock, self).save(*args, **kwargs) diff --git a/apps/livestock/permissions.py b/apps/livestock/permissions.py new file mode 100644 index 0000000..25edb52 --- /dev/null +++ b/apps/livestock/permissions.py @@ -0,0 +1,25 @@ +from rest_framework import permissions + + +# example Code +class AuthorAllStaffAllButEditOrReadOnly(permissions.BasePermission): + edit_methods = ("PUT", "PATCH") + + def has_permission(self, request, view): + if request.user.is_authenticated: + return True + + def has_object_permission(self, request, view, obj): + if request.user.is_superuser: + return True + + if request.method in permissions.SAFE_METHODS: + return True + + if obj.author == request.user: + return True + + if request.user.is_staff and request.method not in self.edit_methods: + return True + + return False diff --git a/apps/livestock/pos/api/__init__.py b/apps/livestock/pos/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/pos/api/v1/__init__.py b/apps/livestock/pos/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/pos/api/v1/serializers.py b/apps/livestock/pos/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/pos/api/v1/urls.py b/apps/livestock/pos/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/pos/api/v1/views.py b/apps/livestock/pos/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/pos/tests/test_common_services.py b/apps/livestock/pos/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/services.py b/apps/livestock/services.py new file mode 100644 index 0000000..93888af --- /dev/null +++ b/apps/livestock/services.py @@ -0,0 +1 @@ +# Your services go here diff --git a/apps/livestock/urls.py b/apps/livestock/urls.py new file mode 100644 index 0000000..0865d84 --- /dev/null +++ b/apps/livestock/urls.py @@ -0,0 +1 @@ +# Your urls go here diff --git a/apps/livestock/web/api/__init__.py b/apps/livestock/web/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/web/api/v1/__init__.py b/apps/livestock/web/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/web/api/v1/serializers.py b/apps/livestock/web/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/web/api/v1/urls.py b/apps/livestock/web/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/web/api/v1/views.py b/apps/livestock/web/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/livestock/web/tests/test_common_services.py b/apps/livestock/web/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos/models.py b/apps/pos/models.py deleted file mode 100644 index 71a8362..0000000 --- a/apps/pos/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/apps/pos/tests.py b/apps/pos/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/apps/pos/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/apps/pos/views.py b/apps/pos/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/apps/pos/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/apps/pos_machine/__init__.py b/apps/pos_machine/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/admin.py b/apps/pos_machine/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/apps/pos_machine/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/pos_machine/apps.py b/apps/pos_machine/apps.py new file mode 100644 index 0000000..e20afe7 --- /dev/null +++ b/apps/pos_machine/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PosMachineConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.pos_machine' diff --git a/apps/pos_machine/management/__init__.py b/apps/pos_machine/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/management/commands/__init__.py b/apps/pos_machine/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/management/commands/command.py b/apps/pos_machine/management/commands/command.py new file mode 100644 index 0000000..c68face --- /dev/null +++ b/apps/pos_machine/management/commands/command.py @@ -0,0 +1 @@ +# Your custom management commands go here. diff --git a/apps/pos_machine/migrations/__init__.py b/apps/pos_machine/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/mobile/api/__init__.py b/apps/pos_machine/mobile/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/mobile/api/v1/__init__.py b/apps/pos_machine/mobile/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/mobile/api/v1/serializers.py b/apps/pos_machine/mobile/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/mobile/api/v1/urls.py b/apps/pos_machine/mobile/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/mobile/api/v1/views.py b/apps/pos_machine/mobile/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/mobile/tests/test_common_services.py b/apps/pos_machine/mobile/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/models.py b/apps/pos_machine/models.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/permissions.py b/apps/pos_machine/permissions.py new file mode 100644 index 0000000..25edb52 --- /dev/null +++ b/apps/pos_machine/permissions.py @@ -0,0 +1,25 @@ +from rest_framework import permissions + + +# example Code +class AuthorAllStaffAllButEditOrReadOnly(permissions.BasePermission): + edit_methods = ("PUT", "PATCH") + + def has_permission(self, request, view): + if request.user.is_authenticated: + return True + + def has_object_permission(self, request, view, obj): + if request.user.is_superuser: + return True + + if request.method in permissions.SAFE_METHODS: + return True + + if obj.author == request.user: + return True + + if request.user.is_staff and request.method not in self.edit_methods: + return True + + return False diff --git a/apps/pos_machine/pos/api/__init__.py b/apps/pos_machine/pos/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/pos/api/v1/__init__.py b/apps/pos_machine/pos/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/pos/api/v1/serializers.py b/apps/pos_machine/pos/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/pos/api/v1/urls.py b/apps/pos_machine/pos/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/pos/api/v1/views.py b/apps/pos_machine/pos/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/pos/tests/test_common_services.py b/apps/pos_machine/pos/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/services.py b/apps/pos_machine/services.py new file mode 100644 index 0000000..93888af --- /dev/null +++ b/apps/pos_machine/services.py @@ -0,0 +1 @@ +# Your services go here diff --git a/apps/pos_machine/urls.py b/apps/pos_machine/urls.py new file mode 100644 index 0000000..0865d84 --- /dev/null +++ b/apps/pos_machine/urls.py @@ -0,0 +1 @@ +# Your urls go here diff --git a/apps/pos_machine/web/api/__init__.py b/apps/pos_machine/web/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/web/api/v1/__init__.py b/apps/pos_machine/web/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/web/api/v1/serializers.py b/apps/pos_machine/web/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/web/api/v1/urls.py b/apps/pos_machine/web/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/web/api/v1/views.py b/apps/pos_machine/web/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/pos_machine/web/tests/test_common_services.py b/apps/pos_machine/web/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/__init__.py b/apps/tag/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/admin.py b/apps/tag/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/apps/tag/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/pos/apps.py b/apps/tag/apps.py similarity index 65% rename from apps/pos/apps.py rename to apps/tag/apps.py index 63b4843..0f9386e 100644 --- a/apps/pos/apps.py +++ b/apps/tag/apps.py @@ -1,6 +1,6 @@ from django.apps import AppConfig -class PosConfig(AppConfig): +class TagConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' - name = 'pos' + name = 'apps.tag' diff --git a/apps/tag/management/__init__.py b/apps/tag/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/management/commands/__init__.py b/apps/tag/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/management/commands/command.py b/apps/tag/management/commands/command.py new file mode 100644 index 0000000..c68face --- /dev/null +++ b/apps/tag/management/commands/command.py @@ -0,0 +1 @@ +# Your custom management commands go here. diff --git a/apps/tag/migrations/0001_initial.py b/apps/tag/migrations/0001_initial.py new file mode 100644 index 0000000..fd41cc5 --- /dev/null +++ b/apps/tag/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# Generated by Django 4.2.20 on 2025-05-05 11:54 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('authentication', '0007_user_ownership'), + ] + + operations = [ + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('trash', models.BooleanField(default=False)), + ('code', models.CharField(max_length=20)), + ('status', models.CharField(max_length=20, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createdby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ('organization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tag_organization', to='authentication.organization')), + ('province', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tag_province', to='authentication.province')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/tag/migrations/__init__.py b/apps/tag/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/mobile/api/__init__.py b/apps/tag/mobile/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/mobile/api/v1/__init__.py b/apps/tag/mobile/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/mobile/api/v1/serializers.py b/apps/tag/mobile/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/mobile/api/v1/urls.py b/apps/tag/mobile/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/mobile/api/v1/views.py b/apps/tag/mobile/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/mobile/tests/test_common_services.py b/apps/tag/mobile/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/models.py b/apps/tag/models.py new file mode 100644 index 0000000..9511ec3 --- /dev/null +++ b/apps/tag/models.py @@ -0,0 +1,30 @@ +from apps.livestock import models as livestock_models +from apps.authentication import models as auth_models +from apps.authorization import models as authoriz_models +from apps.core.models import BaseModel +from django.db import models + + +class Tag(BaseModel): + code = models.CharField(max_length=20) + province = models.ForeignKey( + auth_models.Province, + on_delete=models.CASCADE, + related_name="tag_province", + null=True + ) + organization = models.ForeignKey( + auth_models.Organization, + on_delete=models.CASCADE, + related_name='tag_organization', + null=True + ) + status = models.CharField(max_length=20, null=True) + + def __str__(self): + return f'{self.code}' + + def save(self, *args, **kwargs): + super(Tag, self).save(*args, **kwargs) + + diff --git a/apps/tag/permissions.py b/apps/tag/permissions.py new file mode 100644 index 0000000..25edb52 --- /dev/null +++ b/apps/tag/permissions.py @@ -0,0 +1,25 @@ +from rest_framework import permissions + + +# example Code +class AuthorAllStaffAllButEditOrReadOnly(permissions.BasePermission): + edit_methods = ("PUT", "PATCH") + + def has_permission(self, request, view): + if request.user.is_authenticated: + return True + + def has_object_permission(self, request, view, obj): + if request.user.is_superuser: + return True + + if request.method in permissions.SAFE_METHODS: + return True + + if obj.author == request.user: + return True + + if request.user.is_staff and request.method not in self.edit_methods: + return True + + return False diff --git a/apps/tag/pos/api/__init__.py b/apps/tag/pos/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/pos/api/v1/__init__.py b/apps/tag/pos/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/pos/api/v1/serializers.py b/apps/tag/pos/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/pos/api/v1/urls.py b/apps/tag/pos/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/pos/api/v1/views.py b/apps/tag/pos/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/pos/tests/test_common_services.py b/apps/tag/pos/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/services.py b/apps/tag/services.py new file mode 100644 index 0000000..93888af --- /dev/null +++ b/apps/tag/services.py @@ -0,0 +1 @@ +# Your services go here diff --git a/apps/tag/urls.py b/apps/tag/urls.py new file mode 100644 index 0000000..0865d84 --- /dev/null +++ b/apps/tag/urls.py @@ -0,0 +1 @@ +# Your urls go here diff --git a/apps/tag/web/api/__init__.py b/apps/tag/web/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/web/api/v1/__init__.py b/apps/tag/web/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/web/api/v1/serializers.py b/apps/tag/web/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/web/api/v1/urls.py b/apps/tag/web/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/web/api/v1/views.py b/apps/tag/web/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/tag/web/tests/test_common_services.py b/apps/tag/web/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/__init__.py b/apps/warehouse/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/admin.py b/apps/warehouse/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/apps/warehouse/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/warehouse/apps.py b/apps/warehouse/apps.py new file mode 100644 index 0000000..64fa1be --- /dev/null +++ b/apps/warehouse/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class WarehouseConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.warehouse' diff --git a/apps/warehouse/management/__init__.py b/apps/warehouse/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/management/commands/__init__.py b/apps/warehouse/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/management/commands/command.py b/apps/warehouse/management/commands/command.py new file mode 100644 index 0000000..c68face --- /dev/null +++ b/apps/warehouse/management/commands/command.py @@ -0,0 +1 @@ +# Your custom management commands go here. diff --git a/apps/warehouse/migrations/__init__.py b/apps/warehouse/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/mobile/api/__init__.py b/apps/warehouse/mobile/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/mobile/api/v1/__init__.py b/apps/warehouse/mobile/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/mobile/api/v1/serializers.py b/apps/warehouse/mobile/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/mobile/api/v1/urls.py b/apps/warehouse/mobile/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/mobile/api/v1/views.py b/apps/warehouse/mobile/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/mobile/tests/test_common_services.py b/apps/warehouse/mobile/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/models.py b/apps/warehouse/models.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/pernissions.py b/apps/warehouse/pernissions.py new file mode 100644 index 0000000..25edb52 --- /dev/null +++ b/apps/warehouse/pernissions.py @@ -0,0 +1,25 @@ +from rest_framework import permissions + + +# example Code +class AuthorAllStaffAllButEditOrReadOnly(permissions.BasePermission): + edit_methods = ("PUT", "PATCH") + + def has_permission(self, request, view): + if request.user.is_authenticated: + return True + + def has_object_permission(self, request, view, obj): + if request.user.is_superuser: + return True + + if request.method in permissions.SAFE_METHODS: + return True + + if obj.author == request.user: + return True + + if request.user.is_staff and request.method not in self.edit_methods: + return True + + return False diff --git a/apps/warehouse/pos/api/__init__.py b/apps/warehouse/pos/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/pos/api/v1/__init__.py b/apps/warehouse/pos/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/pos/api/v1/serializers.py b/apps/warehouse/pos/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/pos/api/v1/urls.py b/apps/warehouse/pos/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/pos/api/v1/views.py b/apps/warehouse/pos/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/pos/tests/test_common_services.py b/apps/warehouse/pos/tests/test_common_services.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/services.py b/apps/warehouse/services.py new file mode 100644 index 0000000..93888af --- /dev/null +++ b/apps/warehouse/services.py @@ -0,0 +1 @@ +# Your services go here diff --git a/apps/warehouse/urls.py b/apps/warehouse/urls.py new file mode 100644 index 0000000..0865d84 --- /dev/null +++ b/apps/warehouse/urls.py @@ -0,0 +1 @@ +# Your urls go here diff --git a/apps/warehouse/web/api/__init__.py b/apps/warehouse/web/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/web/api/v1/__init__.py b/apps/warehouse/web/api/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/web/api/v1/serializers.py b/apps/warehouse/web/api/v1/serializers.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/web/api/v1/urls.py b/apps/warehouse/web/api/v1/urls.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/web/api/v1/views.py b/apps/warehouse/web/api/v1/views.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/warehouse/web/tests/test_common_services.py b/apps/warehouse/web/tests/test_common_services.py new file mode 100644 index 0000000..e69de29