Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
15a5978
Enviroment-Setup
aishna05 Mar 28, 2025
876c773
Speech to text converted in flask
codebyyashvi Mar 28, 2025
c7d4419
Well structured the code
codebyyashvi Mar 28, 2025
7eadba3
requirements.txt file added to show all the dependencies and install …
codebyyashvi Mar 28, 2025
1e2acd1
Added .gitignore file
aeshaladani Mar 28, 2025
5b34c03
virtual environment setup and courses app creation
aeshaladani Mar 28, 2025
8e178d4
authentication system done (sign up , login , reset password
aishna05 Mar 28, 2025
0f6b8e0
Dashboard
ladvaurvashi Mar 28, 2025
d67d15b
ASL_Alphabets added in course
ladvaurvashi Mar 29, 2025
e951b31
Modification in Alphabets
ladvaurvashi Mar 29, 2025
0bbbb08
Quiz Implementation
Priya12b Mar 29, 2025
948598e
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
Priya12b Mar 29, 2025
e3119b6
quiz implementation
Priya12b Mar 29, 2025
df2af96
add Numbers in course
ladvaurvashi Mar 29, 2025
abbac5c
Removed __pycache__ and .pyc files from tracking
ladvaurvashi Mar 29, 2025
6a0242a
add numbers in course
ladvaurvashi Mar 29, 2025
7883fee
text_to_asl_sign
aeshaladani Mar 29, 2025
fa7bb74
text_to_Asl
aeshaladani Mar 29, 2025
7f90a03
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
aeshaladani Mar 29, 2025
9fa3ab8
SignToTextConversion
codebyyashvi Mar 29, 2025
aa16620
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
codebyyashvi Mar 29, 2025
8fab3db
error resolved table added
aeshaladani Mar 29, 2025
33eeebf
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
aeshaladani Mar 29, 2025
edc8d9d
made requirements.txt
aeshaladani Mar 29, 2025
c9d6617
Add db.sqlite3 to .gitignore
Priya12b Mar 29, 2025
e8878e5
Added Greeting page and images
ladvaurvashi Mar 29, 2025
bf7758b
Resolved merge conflicts
ladvaurvashi Mar 29, 2025
68746e6
Added Greeting page and images
ladvaurvashi Mar 29, 2025
576f2ee
Resolved merge conflict
ladvaurvashi Mar 29, 2025
acfb39b
error resolved
aeshaladani Mar 29, 2025
a77f3be
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
aeshaladani Mar 29, 2025
82619b2
add basic qus in course
ladvaurvashi Mar 29, 2025
0030505
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
ladvaurvashi Mar 29, 2025
8fe0d69
Update README.md
aeshaladani Mar 29, 2025
84053df
Update README.md
aeshaladani Mar 29, 2025
209d8b7
Update README.md
aeshaladani Mar 29, 2025
c30969e
Update README.md
aeshaladani Mar 29, 2025
cabfb61
speech_to
aeshaladani Mar 29, 2025
90f36d7
speech_to_text
aeshaladani Mar 29, 2025
819266f
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
aeshaladani Mar 29, 2025
b9b74a6
Word Matching & Flashcards
Priya12b Mar 29, 2025
f55bc99
resolved url issues , setuped AIplanner, working on AI model
aishna05 Mar 30, 2025
46cd606
dashboard ui
aeshaladani Mar 30, 2025
3beb938
Add Courses
ladvaurvashi Mar 30, 2025
5764862
Resolved merge conflict in db.sqlite3
ladvaurvashi Mar 30, 2025
b813d38
sign_to_text
codebyyashvi Mar 30, 2025
2c08e18
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
codebyyashvi Mar 30, 2025
ac3a56a
dashboard
ladvaurvashi Mar 30, 2025
e7f1742
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
ladvaurvashi Mar 30, 2025
74612e0
requirements.txt updated
codebyyashvi Mar 30, 2025
bb4b85f
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
codebyyashvi Mar 30, 2025
56241a5
debugging
aeshaladani Mar 30, 2025
04a5583
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
aeshaladani Mar 30, 2025
24e958c
table updated
aeshaladani Mar 30, 2025
91b9974
buttons
ladvaurvashi Mar 30, 2025
47bc1ce
buttons
ladvaurvashi Mar 30, 2025
2398369
text to sign display on same window and in a perfect manner
codebyyashvi Mar 30, 2025
37b4f8f
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
ladvaurvashi Mar 30, 2025
5c38b1c
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
ladvaurvashi Mar 30, 2025
d574523
dashboard
ladvaurvashi Mar 30, 2025
cab5bb3
Resolved merge conflict in db.sqlite3
Priya12b Mar 30, 2025
9008d03
Type The Sign Game
Priya12b Mar 30, 2025
0affe87
debuging
ladvaurvashi Mar 30, 2025
3eecb5f
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
ladvaurvashi Mar 30, 2025
fdfea67
Updated SQLite database with latest changes
aeshaladani Mar 30, 2025
61a4823
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
aeshaladani Mar 30, 2025
33cbde8
resolved previous error
aeshaladani Mar 30, 2025
a462f60
debugging
ladvaurvashi Mar 30, 2025
5fa50db
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
ladvaurvashi Mar 30, 2025
993654e
UI
ladvaurvashi Mar 30, 2025
d686c81
Authentication and UI update
Priya12b Mar 30, 2025
3018b1d
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
Priya12b Mar 30, 2025
bb57f44
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
codebyyashvi Mar 30, 2025
2b3f16e
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
codebyyashvi Mar 30, 2025
2f58dfd
speech to text perfectly worked
codebyyashvi Mar 30, 2025
d917030
PAIN AND SUFFERING, CRYING AND BREAKING DOWN SUCH A VICIOUS CYCLE OF …
aishna05 Mar 30, 2025
ed4d9da
fuck all of u.. fuck python.. fuck django.. stop using this shit.. us…
aishna05 Mar 30, 2025
95d71c9
speech to sign
codebyyashvi Mar 30, 2025
149da46
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
codebyyashvi Mar 30, 2025
37046b2
Update README.md
ladvaurvashi Mar 30, 2025
66b893a
Update README.md
ladvaurvashi Mar 30, 2025
7951ebc
Update README.md
ladvaurvashi Mar 30, 2025
f912103
UI enhance
Priya12b Mar 30, 2025
615257f
speech to text sucessfully
codebyyashvi Mar 30, 2025
29534d2
updated code of speech to text
aeshaladani Mar 30, 2025
79337d8
pushed
aeshaladani Mar 30, 2025
a163ab1
a
aeshaladani Mar 30, 2025
1b7867d
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
aeshaladani Mar 30, 2025
75caddd
Presentation
aeshaladani Mar 30, 2025
f8b7b88
lastpush
aeshaladani Mar 30, 2025
c4513d9
Merge branch 'main' of https://github.com/aishna05/Hack-the-Future
aeshaladani Mar 30, 2025
e621f0c
done last
aeshaladani Mar 30, 2025
41f5d44
All done
codebyyashvi Mar 31, 2025
8ffb00f
qus added
Priya12b Mar 31, 2025
ad0bacc
text to sign page becomes better
codebyyashvi Apr 1, 2025
46f3d43
Merge branch 'Dcodr-Coding-Club:main' into main
codebyyashvi Apr 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Ignore virtual environments
.venv/
venv/
31 changes: 31 additions & 0 deletions .gradio/certificate.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5501
}
Empty file added AIPlanner/__init__.py
Empty file.
Binary file added AIPlanner/__pycache__/__init__.cpython-311.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/__init__.cpython-313.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/__init__.cpython-39.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/admin.cpython-311.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/admin.cpython-312.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/admin.cpython-313.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/admin.cpython-39.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/apps.cpython-311.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/apps.cpython-312.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/apps.cpython-313.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/apps.cpython-39.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/forms.cpython-311.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/forms.cpython-312.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/forms.cpython-313.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/forms.cpython-39.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/models.cpython-311.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/models.cpython-312.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/models.cpython-313.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/models.cpython-39.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/urls.cpython-311.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/urls.cpython-312.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/urls.cpython-313.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/urls.cpython-39.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/views.cpython-311.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/views.cpython-312.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/views.cpython-313.pyc
Binary file not shown.
Binary file added AIPlanner/__pycache__/views.cpython-39.pyc
Binary file not shown.
3 changes: 3 additions & 0 deletions AIPlanner/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions AIPlanner/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class AiplannerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'AIPlanner'
19 changes: 19 additions & 0 deletions AIPlanner/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# ai model -> data from -> their interst in learing -> uske baad course and games suggest krega -> uske hisab se vo course kitne month me ho sakta hai and daily plan bana kr dega ki kitna ho sakta hai -> daily plan and practice schedule and suggestions
from django import forms

class userForm(forms.Form):
pass

class RequestForm(forms.Form):
skill_level = forms.ChoiceField(choices=[
('Beginner', 'Beginner'),
('Intermediate', 'Intermediate'),
('Advanced', 'Advanced')
])
learning_speed = forms.ChoiceField(choices=[
('Slow', 'Slow'),
('Moderate', 'Moderate'),
('Fast', 'Fast')
])
daily_hours = forms.IntegerField(min_value=1)
preferred_days = forms.CharField()
19 changes: 19 additions & 0 deletions AIPlanner/middleware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from django.http import HttpResponse

class SimpleCorsMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
# Handle OPTIONS method to handle preflight requests
if request.method == 'OPTIONS':
response = HttpResponse(status=200)
else:
response = self.get_response(request)

# Add CORS headers
response['Access-Control-Allow-Origin'] = '*' # Allows all domains
response['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
response['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'

return response
64 changes: 64 additions & 0 deletions AIPlanner/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Generated by Django 4.2.20 on 2025-03-29 18:58

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
('gamification', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Course',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('difficulty_level', models.CharField(choices=[('Beginner', 'Beginner'), ('Intermediate', 'Intermediate'), ('Advanced', 'Advanced')], max_length=20)),
('description', models.TextField()),
('topics_and_hours', models.JSONField(default=dict)),
('created_at', models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='StudySchedule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('skill_level', models.CharField(max_length=20)),
('learning_speed', models.CharField(max_length=10)),
('daily_hours', models.IntegerField()),
('preferred_days', models.JSONField(default=list)),
('generated_study_plan', models.TextField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='ExtendedUserProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('skill_level', models.CharField(choices=[('Beginner', 'Beginner'), ('Intermediate', 'Intermediate'), ('Advanced', 'Advanced')], max_length=20)),
('learning_speed', models.CharField(choices=[('Slow', 'Slow'), ('Moderate', 'Moderate'), ('Fast', 'Fast')], max_length=10)),
('daily_hours', models.IntegerField(default=2)),
('preferred_days', models.JSONField(default=list)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Exercise',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('description', models.TextField()),
('difficulty_level', models.CharField(choices=[('Beginner', 'Beginner'), ('Intermediate', 'Intermediate'), ('Advanced', 'Advanced')], max_length=20)),
('exercises_and_hours', models.JSONField()),
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercises', to='gamification.quiz')),
],
),
]
19 changes: 19 additions & 0 deletions AIPlanner/migrations/0002_alter_exercise_course.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.2.20 on 2025-03-29 21:17

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('AIPlanner', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='exercise',
name='course',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercises', to='AIPlanner.course'),
),
]
Empty file.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
81 changes: 81 additions & 0 deletions AIPlanner/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import datetime
from django.db import models
from django.contrib.auth import get_user_model
from gamification.models import Quiz
from Dashboard.models import CustomUser

User = get_user_model()

# Extended User Profile Model
class ExtendedUserProfile(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
skill_level = models.CharField(
max_length=20,
choices=[('Beginner', 'Beginner'), ('Intermediate', 'Intermediate'), ('Advanced', 'Advanced')]
)
learning_speed = models.CharField(
max_length=10,
choices=[('Slow', 'Slow'), ('Moderate', 'Moderate'), ('Fast', 'Fast')]
)
daily_hours = models.IntegerField(default=2)
preferred_days = models.JSONField(default=list) # Example: ['Monday', 'Wednesday', 'Friday']

def __str__(self):
return f"{self.user.name}'s Profile"

class Course(models.Model):
name = models.CharField(max_length=255)
difficulty_level = models.CharField(max_length=20, choices=[('Beginner', 'Beginner'), ('Intermediate', 'Intermediate'), ('Advanced', 'Advanced')])
description = models.TextField()
topics_and_hours = models.JSONField(default=dict) # Format: { "Topic Name": hours }
created_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.name

class Exercise(models.Model):
course = models.ForeignKey(Course, related_name='exercises', on_delete=models.CASCADE)
name = models.CharField(max_length=255)
description = models.TextField()
difficulty_level = models.CharField(max_length=20, choices=[('Beginner', 'Beginner'), ('Intermediate', 'Intermediate'), ('Advanced', 'Advanced')])
exercises_and_hours = models.JSONField()

def __str__(self):
return self.name

# Study Schedule Model
class StudySchedule(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
skill_level = models.CharField(max_length=20)
learning_speed = models.CharField(max_length=10)
daily_hours = models.IntegerField()
preferred_days = models.JSONField(default=list)
generated_study_plan = models.TextField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
return f"{self.user.username}'s Study Schedule"

def calculate_completion_date(self):
user_profile = ExtendedUserProfile.objects.get(user=self.user)
total_hours = self.course.estimated_hours
daily_hours = user_profile.daily_hours
days_needed = total_hours / daily_hours
today = datetime.date.today()

preferred_days = user_profile.preferred_days
delta = datetime.timedelta(days=1)
count = 0
completion_date = today

while count < days_needed:
completion_date += delta
if completion_date.strftime('%A') in preferred_days:
count += 1

return completion_date

def save(self, *args, **kwargs):
if not self.completion_date:
self.completion_date = self.calculate_completion_date()
super().save(*args, **kwargs)
Loading