Skip to content

Commit

Permalink
Merge branch 'main' into staging
Browse files Browse the repository at this point in the history
  • Loading branch information
prabhatsuman committed Jun 28, 2024
2 parents 80f0952 + 84c54f8 commit d78ff90
Show file tree
Hide file tree
Showing 47 changed files with 1,835 additions and 827 deletions.
3 changes: 2 additions & 1 deletion duck_farm_backend/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
__pycache__/
__pycache__/
.env
13 changes: 13 additions & 0 deletions duck_farm_backend/duck_farm/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

from datetime import timedelta
from pathlib import Path
import os
from dotenv import load_dotenv

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
Expand Down Expand Up @@ -42,6 +44,7 @@
'corsheaders',
'rest_framework_simplejwt.token_blacklist',
'management',
'django_crontab',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
Expand Down Expand Up @@ -165,7 +168,17 @@
USE_I18N = True

USE_TZ = True
# SendGrid configuration
load_dotenv()
EMAIL_BACKEND = "sendgrid_backend.SendgridBackend"
SENDGRID_API_KEY = os.getenv('SENDGRID_API_KEY')
SENDGRID_SANDBOX_MODE_IN_DEBUG = False # If True, emails are not sent, but logged


CRONJOBS = [
('* * * * *', 'django.core.management.call_command', ['send_daily_email']),
# Change the cron timing as required; this runs every minute for testing purposes
]

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.0/howto/static-files/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
import random
from datetime import datetime, timedelta
from django.core.management.base import BaseCommand
from management.models import Expense, Dealer

class Command(BaseCommand):
help = 'Generate expense data and save directly to the database'

def handle(self, *args, **kwargs):
start_date = datetime.strptime("20-06-2023", "%d-%m-%Y")
end_date = datetime.strptime("20-06-2024", "%d-%m-%Y")

# Get all dealer IDs to randomly select from
dealer_ids = list(Dealer.objects.values_list('id', flat=True))

current_date = start_date
while current_date <= end_date:
# Generate expense data
exp_type = random.choice([etype[0] for etype in Expense.EXPENSE_TYPES])
expense_amount = random.uniform(100, 2500)

expense = Expense(
date=current_date.date(),
amount=round(expense_amount, 2),
description="Randomly generated expense",
exp_type=exp_type,
dealer_id=random.choice(dealer_ids) # Randomly select dealer ID
)
expense.save()

# Move to the next day
current_date += timedelta(days=1)

self.stdout.write(self.style.SUCCESS('Successfully generated and saved expense data to the database'))
import random
from datetime import datetime, timedelta
from django.core.management.base import BaseCommand
from management.models import Expense, Dealer

class Command(BaseCommand):
help = 'Generate expense data and save directly to the database'

def handle(self, *args, **kwargs):
start_date = datetime.strptime("20-06-2023", "%d-%m-%Y")
end_date = datetime.strptime("20-06-2024", "%d-%m-%Y")

# Get all dealer IDs to randomly select from
dealer_ids = list(Dealer.objects.values_list('id', flat=True))

current_date = start_date
while current_date <= end_date:
# Generate expense data
exp_type = random.choice([etype[0] for etype in Expense.EXPENSE_TYPES])
expense_amount = random.uniform(100, 2500)

expense = Expense(
date=current_date.date(),
amount=round(expense_amount, 2),
description="Randomly generated expense",
exp_type=exp_type,
dealer_id=random.choice(dealer_ids) # Randomly select dealer ID
)
expense.save()

# Move to the next day
current_date += timedelta(days=1)

self.stdout.write(self.style.SUCCESS('Successfully generated and saved expense data to the database'))
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# management/commands/send_daily_email.py
import os
import logging
from django.core.management.base import BaseCommand, CommandError
from django.core.mail import send_mail
from django.contrib.auth.models import User # Adjust this import to match your User model location

# Determine the log file path
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LOG_FILE_PATH = os.path.join(BASE_DIR, 'send_daily_email.log')

# Set up logging
logger = logging.getLogger(__name__)
handler = logging.FileHandler(LOG_FILE_PATH)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)


class Command(BaseCommand):
help = 'Sends a daily email reminder to the user "prabhat" to fill in egg collection data.'

def handle(self, *args, **kwargs):
try:
# Get the user by hardcoded username "prabhat"
username = "prabhat"
user = User.objects.get(username=username)

subject = 'Daily Reminder: Fill in Egg Collection Data'
message = f'Dear {user.first_name},\n\nThis is a friendly reminder to fill in the egg collection data for today.\n\nBest regards,\nYour Application Team'

send_mail(
subject,
message,
'prabhatsuman0612@gmail.com', # Replace with your verified sender email
[user.email],
fail_silently=False,
)

logger.info(f"Successfully sent email reminder to {user.email}")
self.stdout.write(self.style.SUCCESS(f"Successfully sent email reminder to {user.email}"))

except User.DoesNotExist:
error_message = f'User with username "{username}" does not exist'
logger.error(error_message)
raise CommandError(error_message)
except Exception as e:
logger.error(f'An error occurred: {str(e)}', exc_info=True)
raise CommandError(f'An error occurred: {str(e)}')
3 changes: 3 additions & 0 deletions duck_farm_backend/management/management/send_daily_email.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
2024-06-24 19:21:19,931 - management.management.commands.send_daily_email - INFO - Successfully sent email reminder to mr.prabhatsuman@gmail.com
2024-06-24 19:22:17,343 - management.management.commands.send_daily_email - INFO - Successfully sent email reminder to mr.prabhatsuman@gmail.com
2024-06-24 19:23:17,775 - management.management.commands.send_daily_email - INFO - Successfully sent email reminder to mr.prabhatsuman@gmail.com
21 changes: 21 additions & 0 deletions duck_farm_backend/management/migrations/0010_currentfeed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 5.0.6 on 2024-06-28 09:37

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('management', '0009_sales'),
]

operations = [
migrations.CreateModel(
name='CurrentFeed',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('quantity', models.PositiveIntegerField()),
],
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.0.6 on 2024-06-28 10:09

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('management', '0010_currentfeed'),
]

operations = [
migrations.AlterField(
model_name='currentfeed',
name='name',
field=models.CharField(max_length=100, unique=True),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.0.6 on 2024-06-28 10:13

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('management', '0011_alter_currentfeed_name'),
]

operations = [
migrations.AlterField(
model_name='currentfeed',
name='quantity',
field=models.PositiveIntegerField(default=0),
),
]
23 changes: 23 additions & 0 deletions duck_farm_backend/management/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,20 @@ class FeedStock(Stock):
price = models.DecimalField(max_digits=10, decimal_places=2)
date_of_purchase = models.DateField()

def save(self, *args, **kwargs):
# Fetch the CurrentFeed object or create it if it does not exist
current_feed, created = CurrentFeed.objects.get_or_create(name=self.name)

if not created: # If the CurrentFeed object already existed
current_feed.quantity += self.quantity
else:
current_feed.quantity = self.quantity

current_feed.save()
super().save(*args, **kwargs)




class MedicineStock(Stock):
name = models.CharField(max_length=100)
Expand Down Expand Up @@ -110,3 +124,12 @@ class Sales(models.Model):

def __str__(self):
return f"{self.dealer} - {self.amount}"

class CurrentFeed(models.Model):
name=models.CharField(max_length=100,unique=True)
quantity = models.PositiveIntegerField(default=0)

def __str__(self):
return self.name


3 changes: 3 additions & 0 deletions duck_farm_backend/management/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,17 @@ class SalesPagination(PageNumberPagination):

def paginate_queryset(self,queryset,request,view=None):
self.total_amount = queryset.aggregate(total_amount=Sum('amount'))['total_amount'] or 0
self.total_quantity = queryset.aggregate(total_quantity=Sum('quantity'))['total_quantity'] or 0
return super().paginate_queryset(queryset,request,view)


def get_paginated_response(self,data):
return Response({
'count': self.page.paginator.count,
'total_pages': self.page.paginator.num_pages,
'current_page': self.page.number,
'total_amount': self.total_amount,
'total_quantity': self.total_quantity,
'results': data,
})

Expand Down
13 changes: 12 additions & 1 deletion duck_farm_backend/management/serializers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# management/serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import DuckInfo, Dealer, Expense, FeedStock, MedicineStock, OtherStock, EggStock, DailyEggCollection, Sales
from .models import DuckInfo, Dealer, Expense, FeedStock, MedicineStock, OtherStock, EggStock, DailyEggCollection, Sales, CurrentFeed
from datetime import datetime
from django.db import models

Expand Down Expand Up @@ -154,3 +154,14 @@ class SalesSerializer(serializers.ModelSerializer):
class Meta:
model = Sales
fields = ['id', 'date', 'dealer', 'quantity', 'amount', 'description']

class SalesAddSerializer(serializers.Serializer):
dealer = serializers.PrimaryKeyRelatedField(queryset=Dealer.objects.all())
quantity = serializers.IntegerField()
date=serializers.DateField()
price = serializers.DecimalField(max_digits=10, decimal_places=2)

class CurrentFeedSerializer(serializers.ModelSerializer):
class Meta:
model = CurrentFeed
fields = '__all__'
4 changes: 3 additions & 1 deletion duck_farm_backend/management/urls.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# management/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import DuckInfoViewSet, DealerViewSet, ExpenseViewSet, RegisterView, LoginView, FeedStockViewSet, MedicineStockViewSet, OtherStockViewSet, DailyEggCollectionViewSet, SalesViewSet, ClearCacheView, EarningViewSet
from .views import DuckInfoViewSet, DealerViewSet, ExpenseViewSet, RegisterView, LoginView, FeedStockViewSet, MedicineStockViewSet, OtherStockViewSet, DailyEggCollectionViewSet, SalesViewSet, ClearCacheView, EarningViewSet, ChatbotView, CurrentFeedViewSet
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

router = DefaultRouter()
Expand All @@ -11,6 +11,7 @@
router.register('egg_stock', DailyEggCollectionViewSet)
router.register('sales', SalesViewSet)
router.register('earnings', EarningViewSet, basename='earnings')
router.register('current_feed', CurrentFeedViewSet)



Expand All @@ -28,4 +29,5 @@
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('clear_cache/',ClearCacheView.as_view(), name='clear_cache'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('chatbot/<str:selected_type>/<str:selected_period>/',ChatbotView.as_view(), name='chatbot'),
]
Loading

0 comments on commit d78ff90

Please sign in to comment.