Skip to content

Commit 0f2e376

Browse files
authored
Merge pull request #21 from akirachix/develop
Develop
2 parents 45f57c8 + 11f4d39 commit 0f2e376

22 files changed

+450
-386
lines changed

api/views.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from .serializers import ReviewSerializer
3838
from django_filters.rest_framework import DjangoFilterBackend
3939
import json
40+
from django.core.cache import cache
4041

4142
class ReviewViewSet(viewsets.ModelViewSet):
4243
queryset = Review.objects.all()
@@ -112,6 +113,7 @@ def post(self, request):
112113

113114

114115
otp = str(random.randint(1000, 9999))
116+
cache.set(f'otp_{email}',otp,timeout=300)
115117
otp_storage[email] = otp
116118

117119

@@ -132,12 +134,10 @@ def post(self, request):
132134
serializer.is_valid(raise_exception=True)
133135
email = serializer.validated_data['email']
134136
otp = serializer.validated_data['otp']
135-
136-
137-
if otp_storage.get(email) != otp:
138-
return Response({"detail": "Invalid OTP."}, status=status.HTTP_400_BAD_REQUEST)
139-
140-
137+
cached_otp=cache.get(f'otp_{email}')
138+
if cached_otp is None:
139+
return Response({"detail": "Otp has expired"},status=status.HTTP_400_BAD_REQUEST)
140+
cache.delete(f"otp_{email}")
141141
return Response({"detail": "OTP verified."})
142142

143143

@@ -147,17 +147,18 @@ def post(self, request):
147147
serializer.is_valid(raise_exception=True)
148148
email = serializer.validated_data['email']
149149
password = serializer.validated_data['password']
150-
151-
152150
try:
153151
user = User.objects.get(email=email)
152+
153+
154154
except User.DoesNotExist:
155155
return Response({"detail": "User with this email does not exist."}, status=status.HTTP_400_BAD_REQUEST)
156156

157157

158158
user.set_password(password)
159159
user.save()
160-
otp_storage.pop(email, None)
160+
cache.delete(f"otp_{email}")
161+
161162
return Response({"detail": "Password reset successful."})
162163

163164
class OrderViewSet(viewsets.ModelViewSet):

feedlink/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from dotenv import load_dotenv
1414
import dj_database_url
1515

16+
1617
load_dotenv()
1718
import environ
1819

Lines changed: 62 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.2.6 on 2025-09-12 07:21
1+
# Generated by Django 4.2.24 on 2025-09-25 07:16
22

33
from django.db import migrations, models
44

@@ -7,28 +7,71 @@ class Migration(migrations.Migration):
77

88
initial = True
99

10-
dependencies = [
11-
]
10+
dependencies = []
1211

1312
operations = [
1413
migrations.CreateModel(
15-
name='Listing',
14+
name="Listing",
1615
fields=[
17-
('listing_id', models.AutoField(primary_key=True, serialize=False)),
18-
('product_type', models.CharField(choices=[('edible', 'Edible'), ('inedible', 'Inedible')], max_length=10)),
19-
('category', models.CharField(max_length=50)),
20-
('description', models.CharField(max_length=200)),
21-
('quantity', models.DecimalField(decimal_places=2, max_digits=10)),
22-
('original_price', models.DecimalField(decimal_places=2, max_digits=10)),
23-
('expiry_date', models.DateTimeField()),
24-
('discounted_price', models.DecimalField(decimal_places=2, max_digits=10)),
25-
('image', models.ImageField(blank=True, null=True, upload_to='listing_images/')),
26-
('image_url', models.URLField(blank=True, null=True)),
27-
('status', models.CharField(choices=[('available', 'Available'), ('expired', 'Expired')], default='available', max_length=20)),
28-
('created_at', models.DateTimeField(auto_now_add=True)),
29-
('updated_at', models.DateTimeField(auto_now=True)),
30-
('upload_method', models.CharField(choices=[('manual', 'Manual'), ('csv', 'CSV')], max_length=10)),
31-
('pickup_window_duration', models.DateTimeField()),
16+
("listing_id", models.AutoField(primary_key=True, serialize=False)),
17+
(
18+
"product_type",
19+
models.CharField(
20+
choices=[("edible", "Edible"), ("inedible", "Inedible")],
21+
max_length=10,
22+
),
23+
),
24+
("category", models.CharField(blank=True, max_length=50, null=True)),
25+
(
26+
"description",
27+
models.CharField(blank=True, max_length=200, null=True),
28+
),
29+
("quantity", models.DecimalField(decimal_places=2, max_digits=10)),
30+
(
31+
"original_price",
32+
models.DecimalField(
33+
blank=True, decimal_places=2, max_digits=10, null=True
34+
),
35+
),
36+
("expiry_date", models.DateTimeField(blank=True, null=True)),
37+
(
38+
"discounted_price",
39+
models.DecimalField(
40+
blank=True, decimal_places=2, max_digits=10, null=True
41+
),
42+
),
43+
(
44+
"image",
45+
models.ImageField(
46+
blank=True, null=True, upload_to="listing_images/"
47+
),
48+
),
49+
("image_url", models.URLField(blank=True, null=True)),
50+
(
51+
"status",
52+
models.CharField(
53+
choices=[("available", "Available"), ("expired", "Expired")],
54+
default="available",
55+
max_length=20,
56+
),
57+
),
58+
("created_at", models.DateTimeField(auto_now_add=True)),
59+
("updated_at", models.DateTimeField(auto_now=True)),
60+
(
61+
"upload_method",
62+
models.CharField(
63+
choices=[("manual", "Manual"), ("csv", "CSV")], max_length=10
64+
),
65+
),
66+
("pickup_window_duration", models.DateTimeField()),
67+
(
68+
"unit",
69+
models.CharField(
70+
choices=[("kg", "kg"), ("L", "L"), ("unit", "unit")],
71+
help_text="Select the unit: kg (weight), L (volume), or unit (count of items)",
72+
max_length=10,
73+
),
74+
),
3275
],
3376
),
3477
]
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
# Generated by Django 5.2.6 on 2025-09-12 14:43
1+
# Generated by Django 4.2.24 on 2025-09-25 07:16
22

3-
import django.db.models.deletion
43
from django.conf import settings
54
from django.db import migrations, models
5+
import django.db.models.deletion
66

77

88
class Migration(migrations.Migration):
99

10+
initial = True
11+
1012
dependencies = [
1113
("inventory", "0001_initial"),
1214
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
@@ -17,12 +19,9 @@ class Migration(migrations.Migration):
1719
model_name="listing",
1820
name="producer",
1921
field=models.ForeignKey(
20-
default=1,
2122
limit_choices_to={"role": "producer"},
22-
null=True,
2323
on_delete=django.db.models.deletion.CASCADE,
2424
to=settings.AUTH_USER_MODEL,
25-
# preserve_default=False,
2625
),
2726
),
2827
]

inventory/migrations/0003_alter_listing_category_alter_listing_description_and_more.py

Lines changed: 0 additions & 43 deletions
This file was deleted.

inventory/migrations/0004_alter_listing_quantity.py

Lines changed: 0 additions & 19 deletions
This file was deleted.

inventory/migrations/0005_alter_listing_producer.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

inventory/migrations/0007_listing_unit_alter_listing_producer.py

Lines changed: 0 additions & 38 deletions
This file was deleted.
Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.2.6 on 2025-09-12 07:21
1+
# Generated by Django 4.2.24 on 2025-09-25 07:16
22

33
from django.db import migrations, models
44

@@ -7,17 +7,35 @@ class Migration(migrations.Migration):
77

88
initial = True
99

10-
dependencies = [
11-
]
10+
dependencies = []
1211

1312
operations = [
1413
migrations.CreateModel(
15-
name='UserLocation',
14+
name="UserLocation",
1615
fields=[
17-
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18-
('address', models.CharField(blank=True, max_length=100, null=True)),
19-
('latitude', models.DecimalField(blank=True, decimal_places=7, max_digits=10, null=True)),
20-
('longitude', models.DecimalField(blank=True, decimal_places=7, max_digits=10, null=True)),
16+
(
17+
"id",
18+
models.BigAutoField(
19+
auto_created=True,
20+
primary_key=True,
21+
serialize=False,
22+
verbose_name="ID",
23+
),
24+
),
25+
("address", models.CharField(blank=True, max_length=100, null=True)),
26+
(
27+
"latitude",
28+
models.DecimalField(
29+
blank=True, decimal_places=7, max_digits=10, null=True
30+
),
31+
),
32+
(
33+
"longitude",
34+
models.DecimalField(
35+
blank=True, decimal_places=7, max_digits=10, null=True
36+
),
37+
),
38+
("radius_km", models.FloatField(default=0.5)),
2139
],
2240
),
2341
]
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
1-
# Generated by Django 5.2.6 on 2025-09-12 07:21
1+
# Generated by Django 4.2.24 on 2025-09-25 07:16
22

3-
import django.db.models.deletion
43
from django.conf import settings
54
from django.db import migrations, models
5+
import django.db.models.deletion
66

77

88
class Migration(migrations.Migration):
99

1010
initial = True
1111

1212
dependencies = [
13-
('location', '0001_initial'),
13+
("location", "0001_initial"),
1414
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
1515
]
1616

1717
operations = [
1818
migrations.AddField(
19-
model_name='userlocation',
20-
name='user',
21-
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='location', to=settings.AUTH_USER_MODEL),
19+
model_name="userlocation",
20+
name="user",
21+
field=models.OneToOneField(
22+
on_delete=django.db.models.deletion.CASCADE,
23+
related_name="location",
24+
to=settings.AUTH_USER_MODEL,
25+
),
2226
),
2327
]

0 commit comments

Comments
 (0)