├── Account ├── task.py ├── __init__.py ├── migrations │ ├── __init__.py │ ├── 0008_remove_address_phone_number.py │ ├── 0004_alter_category_options.py │ ├── 0009_alter_occupation_options.py │ ├── 0002_rename_is_superadmin_user_is_superuser.py │ ├── 0012_user_is_setup_complete.py │ ├── 0006_user_cover.py │ ├── 0007_user_cat.py │ ├── 0010_alter_occupation_cat.py │ ├── 0003_alter_user_occup.py │ ├── 0013_alter_user_cover_alter_user_pic.py │ ├── 0005_alter_category_category_name_alter_occupation_titile.py │ ├── 0011_alter_address_city_alter_address_country_and_more.py │ └── 0001_initial.py ├── tests.py ├── apps.py ├── admin.py ├── tocken.py ├── permision.py ├── helpers.py ├── urls.py ├── serilizer.py ├── views2.py ├── models.py └── views.py ├── Home ├── __init__.py ├── migrations │ ├── __init__.py │ ├── 0006_member_category.py │ ├── 0003_member_is_list_quote_is_list.py │ ├── 0002_alter_banner_img_alter_member_img.py │ ├── 0005_alter_banner_title_alter_member_title.py │ ├── 0007_review_user1_alter_review_user.py │ ├── 0004_alter_banner_options_alter_member_options_and_more.py │ └── 0001_initial.py ├── tests.py ├── apps.py ├── admin.py ├── serializer.py ├── models.py ├── urls.py ├── views2.py └── views.py ├── Post ├── __init__.py ├── migrations │ ├── __init__.py │ ├── 0002_remove_post_comment_count_remove_post_like_count.py │ ├── 0003_post_comment_count_post_like_count.py │ └── 0001_initial.py ├── tests.py ├── apps.py ├── admin.py ├── urls.py ├── signals.py ├── serializer.py ├── views2.py ├── models.py └── views.py ├── Backend ├── __init__.py ├── wsgi.py ├── celery.py ├── asgi.py ├── urls.py └── settings.py ├── Message ├── __init__.py ├── migrations │ ├── __init__.py │ ├── 0002_solution_delete_soluton.py │ ├── 0006_news.py │ ├── 0004_notification.py │ ├── 0003_alter_question_options_alter_solution_options_and_more.py │ ├── 0005_messages.py │ └── 0001_initial.py ├── tests.py ├── apps.py ├── routing.py ├── admin.py ├── urls.py ├── serializer.py ├── models.py ├── consumers.py ├── views2.py └── views.py ├── db.sqlite3 ├── package.json ├── pro_pic └── appa.jpeg ├── celerybeat-schedule.dat ├── celerybeat-schedule.bak ├── celerybeat-schedule.dir ├── requirements.txt ├── templates ├── Reset_password_email.html └── account_verify_email.html ├── manage.py └── .gitignore /Account/task.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Home/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Post/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Account/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Backend/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Message/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Home/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Post/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Account/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Message/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Account/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /Home/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /Message/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /Post/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahidthoduvil/FarmUnity-backend/HEAD/db.sqlite3 -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "sweetalert2": "^11.7.18" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /pro_pic/appa.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahidthoduvil/FarmUnity-backend/HEAD/pro_pic/appa.jpeg -------------------------------------------------------------------------------- /celerybeat-schedule.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahidthoduvil/FarmUnity-backend/HEAD/celerybeat-schedule.dat -------------------------------------------------------------------------------- /celerybeat-schedule.bak: -------------------------------------------------------------------------------- 1 | 'entries', (0, 5) 2 | '__version__', (512, 20) 3 | 'tz', (1024, 18) 4 | 'utc_enabled', (1536, 4) 5 | -------------------------------------------------------------------------------- /celerybeat-schedule.dir: -------------------------------------------------------------------------------- 1 | 'entries', (0, 5) 2 | '__version__', (512, 20) 3 | 'tz', (1024, 18) 4 | 'utc_enabled', (1536, 4) 5 | -------------------------------------------------------------------------------- /Home/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class HomeConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'Home' 7 | -------------------------------------------------------------------------------- /Post/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PostConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'Post' 7 | -------------------------------------------------------------------------------- /Account/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AccountConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'Account' 7 | -------------------------------------------------------------------------------- /Message/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MessageConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'Message' 7 | -------------------------------------------------------------------------------- /Message/routing.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .consumers import ChatConsumer 3 | 4 | websocket_urlpatterns=[ 5 | path('ws/chat//',ChatConsumer.as_asgi()), 6 | ] 7 | -------------------------------------------------------------------------------- /Home/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from.models import * 3 | 4 | # Register your models here. 5 | 6 | admin.site.register(Member) 7 | admin.site.register(Banner) 8 | admin.site.register(Quote) 9 | admin.site.register(Review) -------------------------------------------------------------------------------- /Account/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import * 3 | # Register your models here. 4 | 5 | admin.site.register(User) 6 | admin.site.register(Occupation) 7 | admin.site.register(Category) 8 | admin.site.register(Address) 9 | -------------------------------------------------------------------------------- /Post/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import * 3 | 4 | 5 | # Register your models here. 6 | admin.site.register(Post) 7 | admin.site.register(Comments) 8 | admin.site.register(Like) 9 | admin.site.register(Follow) 10 | -------------------------------------------------------------------------------- /Message/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import * 3 | # Register your models here. 4 | 5 | 6 | admin.site.register(Question) 7 | admin.site.register(Solution) 8 | admin.site.register(Notification) 9 | admin.site.register(News) 10 | 11 | 12 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | channels==4.0.0 2 | channels-redis==4.1.0 3 | daphne==4.0.0 4 | cloudinary==1.34 5 | Django 6 | django-cors-headers 7 | djangorestframework 8 | djangorestframework-simplejwt 9 | psycopg2 10 | python-decouple 11 | redis 12 | requests 13 | pillow 14 | django-cloudinary-storage 15 | celery 16 | wheel -------------------------------------------------------------------------------- /templates/Reset_password_email.html: -------------------------------------------------------------------------------- 1 | {% autoescape off %} 2 | 3 | Hii {{user.first_name}}, 4 | 5 | Please click the below link to reset your password. 6 | https://farm-community.onrender.com{% url 'resetPassword_validate' uidb64=uid token=token %} 7 | 8 | If its not you, please ignore this mail. 9 | 10 | {% endautoescape %} -------------------------------------------------------------------------------- /templates/account_verify_email.html: -------------------------------------------------------------------------------- 1 | {% autoescape off %} 2 | 3 | Hii {{user.username}}, 4 | 5 | Please click on below link to confirm your registration. 6 | 7 | https://farm-community.onrender.com{% url 'activate' uidb64=uid token=token %} 8 | 9 | If its not you, please ignore this mail. 10 | 11 | 12 | This link will be valid for 1 minutes. 13 | 14 | If it's not you, please ignore this mail. 15 | 16 | {% endautoescape %} -------------------------------------------------------------------------------- /Account/migrations/0008_remove_address_phone_number.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-21 05:33 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Account', '0007_user_cat'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='address', 15 | name='phone_number', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /Account/migrations/0004_alter_category_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-14 14:25 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Account', '0003_alter_user_occup'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='category', 15 | options={'verbose_name': 'category'}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /Account/tocken.py: -------------------------------------------------------------------------------- 1 | from rest_framework_simplejwt.tokens import RefreshToken 2 | from django.contrib.auth import get_user_model 3 | 4 | 5 | User = get_user_model() 6 | 7 | def create_jwt_pair_tokens(user: User): 8 | refresh = RefreshToken.for_user(user) 9 | refresh['is_setup_complete'] = user.is_setup_complete 10 | tokens = { 11 | "access": str(refresh.access_token), 12 | "refresh": str(refresh) 13 | } 14 | return tokens 15 | 16 | 17 | -------------------------------------------------------------------------------- /Backend/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for Backend project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Backend.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /Account/migrations/0009_alter_occupation_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-27 05:31 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Account', '0008_remove_address_phone_number'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='occupation', 15 | options={'verbose_name': 'Occupation'}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /Account/migrations/0002_rename_is_superadmin_user_is_superuser.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-13 16:32 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Account', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='user', 15 | old_name='is_superadmin', 16 | new_name='is_superuser', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /Account/migrations/0012_user_is_setup_complete.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-30 13:11 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Account', '0011_alter_address_city_alter_address_country_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='user', 15 | name='is_setup_complete', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /Backend/celery.py: -------------------------------------------------------------------------------- 1 | 2 | # import os 3 | # from celery import Celery 4 | # from celery.schedules import crontab 5 | 6 | 7 | 8 | # os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Backend.settings') 9 | 10 | # app = Celery('Backend') 11 | # app.config_from_object('django.conf:settings',namespace='CELERY') 12 | # app.autodiscover_tasks() 13 | 14 | # app.conf.beat_schedule = { 15 | # 'delete_activation_link': { 16 | # 'task': 'Account.views.delete_activation_link', 17 | # 'schedule': crontab(minute=1), 18 | # }, 19 | # } -------------------------------------------------------------------------------- /Post/migrations/0002_remove_post_comment_count_remove_post_like_count.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-23 12:25 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Post', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='post', 15 | name='comment_count', 16 | ), 17 | migrations.RemoveField( 18 | model_name='post', 19 | name='like_count', 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /Account/migrations/0006_user_cover.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-17 02:49 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Account', '0005_alter_category_category_name_alter_occupation_titile'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='user', 15 | name='cover', 16 | field=models.ImageField(blank=True, default='static/img/userprofile.jpg', null=True, upload_to='cover/'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /Account/migrations/0007_user_cat.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-17 06:12 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('Account', '0006_user_cover'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='user', 16 | name='cat', 17 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='Account.category'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /Account/migrations/0010_alter_occupation_cat.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-27 05:36 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('Account', '0009_alter_occupation_options'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='occupation', 16 | name='Cat', 17 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='Account.category'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /Account/migrations/0003_alter_user_occup.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-13 16:35 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('Account', '0002_rename_is_superadmin_user_is_superuser'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='user', 16 | name='Occup', 17 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='Account.occupation'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /Home/migrations/0006_member_category.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-05 16:17 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('Account', '0012_user_is_setup_complete'), 11 | ('Home', '0005_alter_banner_title_alter_member_title'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='member', 17 | name='category', 18 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='Account.category'), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /Home/migrations/0003_member_is_list_quote_is_list.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-21 05:38 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Home', '0002_alter_banner_img_alter_member_img'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='member', 15 | name='is_list', 16 | field=models.BooleanField(default=False), 17 | ), 18 | migrations.AddField( 19 | model_name='quote', 20 | name='is_list', 21 | field=models.BooleanField(default=False), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /Home/migrations/0002_alter_banner_img_alter_member_img.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-21 05:36 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Home', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='banner', 15 | name='img', 16 | field=models.ImageField(default='default.jpg', upload_to='Banner'), 17 | ), 18 | migrations.AlterField( 19 | model_name='member', 20 | name='img', 21 | field=models.ImageField(default='default.jpg', upload_to='Member'), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /Post/migrations/0003_post_comment_count_post_like_count.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-23 12:26 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Post', '0002_remove_post_comment_count_remove_post_like_count'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='post', 15 | name='comment_count', 16 | field=models.PositiveIntegerField(default=0), 17 | ), 18 | migrations.AddField( 19 | model_name='post', 20 | name='like_count', 21 | field=models.PositiveIntegerField(default=0), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /Account/migrations/0013_alter_user_cover_alter_user_pic.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-12 06:59 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Account', '0012_user_is_setup_complete'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='user', 15 | name='cover', 16 | field=models.ImageField(blank=True, null=True, upload_to='cover/'), 17 | ), 18 | migrations.AlterField( 19 | model_name='user', 20 | name='pic', 21 | field=models.ImageField(blank=True, null=True, upload_to='pro_pic/'), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Backend.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /Home/migrations/0005_alter_banner_title_alter_member_title.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-01 03:31 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Home', '0004_alter_banner_options_alter_member_options_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='banner', 15 | name='title', 16 | field=models.CharField(blank=True, max_length=200, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='member', 20 | name='title', 21 | field=models.CharField(blank=True, max_length=200, null=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /Account/migrations/0005_alter_category_category_name_alter_occupation_titile.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-16 11:08 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Account', '0004_alter_category_options'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='category', 15 | name='Category_name', 16 | field=models.CharField(blank=True, max_length=250, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='occupation', 20 | name='titile', 21 | field=models.CharField(blank=True, max_length=250, null=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /Backend/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for Backend project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | import django 12 | 13 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Backend.settings") 14 | django.setup() 15 | from django.core.asgi import get_asgi_application 16 | from channels.routing import ProtocolTypeRouter 17 | from channels.routing import ProtocolTypeRouter, URLRouter 18 | from Message.routing import websocket_urlpatterns 19 | 20 | 21 | django_asgi_app = get_asgi_application() 22 | 23 | application = ProtocolTypeRouter( 24 | { 25 | "http": django_asgi_app, 26 | "websocket": ( 27 | (URLRouter(websocket_urlpatterns)) 28 | ), 29 | } 30 | ) -------------------------------------------------------------------------------- /Message/migrations/0002_solution_delete_soluton.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-14 18:38 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('Message', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Solution', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('answer', models.CharField(max_length=200)), 19 | ('quest', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Message.question')), 20 | ], 21 | ), 22 | migrations.DeleteModel( 23 | name='Soluton', 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /Message/migrations/0006_news.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.6 on 2024-06-20 20:43 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('Message', '0005_messages'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='News', 15 | fields=[ 16 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('author', models.CharField(max_length=1000, null=True)), 18 | ('title', models.CharField(max_length=1000, null=True)), 19 | ('description', models.TextField(null=True)), 20 | ('url', models.URLField(max_length=1000, null=True)), 21 | ('url_to_image', models.URLField(max_length=1000, null=True)), 22 | ], 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /Home/serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import * 3 | from Account.serilizer import * 4 | 5 | 6 | 7 | class MemberListSerializer(serializers.ModelSerializer): 8 | class Meta: 9 | model=Member 10 | fields='__all__' 11 | 12 | 13 | class BannerListSerializer(serializers.ModelSerializer): 14 | class Meta: 15 | model=Banner 16 | fields='__all__' 17 | 18 | class QuoteListSerializer(serializers.ModelSerializer): 19 | class Meta: 20 | model=Quote 21 | fields='__all__' 22 | 23 | 24 | class ReviewSerializer(serializers.ModelSerializer): 25 | user = UserSerializer() 26 | user1 = UserSerializer() 27 | 28 | class Meta: 29 | model = Review 30 | fields = ['user', 'rate', 'message', 'user1','id'] 31 | 32 | class CreateReviewSerializer(serializers.ModelSerializer): 33 | 34 | class Meta: 35 | model=Review 36 | fields='__all__' 37 | -------------------------------------------------------------------------------- /Home/migrations/0007_review_user1_alter_review_user.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-14 06:11 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('Home', '0006_member_category'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='review', 18 | name='user1', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='additional_reviews', to=settings.AUTH_USER_MODEL), 20 | ), 21 | migrations.AlterField( 22 | model_name='review', 23 | name='user', 24 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews', to=settings.AUTH_USER_MODEL), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /Message/migrations/0004_notification.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-18 14:59 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('Message', '0003_alter_question_options_alter_solution_options_and_more'), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='Notification', 18 | fields=[ 19 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 | ('message', models.CharField(blank=True, max_length=200)), 21 | ('date', models.DateTimeField(auto_now_add=True)), 22 | ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 23 | ], 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /Message/migrations/0003_alter_question_options_alter_solution_options_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-15 06:45 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('Message', '0002_solution_delete_soluton'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterModelOptions( 17 | name='question', 18 | options={'verbose_name': 'Question'}, 19 | ), 20 | migrations.AlterModelOptions( 21 | name='solution', 22 | options={'verbose_name': 'Solution'}, 23 | ), 24 | migrations.AddField( 25 | model_name='solution', 26 | name='user', 27 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /Post/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .views import * 3 | from .views2 import * 4 | 5 | urlpatterns = [ 6 | 7 | path('posts//',PostList.as_view()), 8 | path('post//',PostListAdmin.as_view()), 9 | path('add-post/', AddPostView.as_view(), name='add-post'), 10 | path('delete//', DeletePostView.as_view(), name='delete-post'), 11 | path('/user-comments/', UserCommentsView.as_view(), name='user_comments'), 12 | path('/comments/', PostCommentsView.as_view(), name='post_comments'), 13 | path('add-comment/', AddCommentView.as_view(), name='add-comment'), 14 | path('user-posts//', UserPostList.as_view()), 15 | path('user-posts//', UserPost.as_view()), 16 | path('Postdelete//', DeletePost.as_view(), name='delete-post'), 17 | path('delete-comment//', CommentDeleteView.as_view(), name='delete_comment'), 18 | path("like-post/",PostLikeView.as_view()), 19 | path("un-like-post///",un_like_post), 20 | path("follow///", FollowView.as_view()), 21 | 22 | 23 | ] 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Account/permision.py: -------------------------------------------------------------------------------- 1 | from rest_framework.permissions import BasePermission 2 | from .helpers import decode_jwt_payload 3 | import json 4 | from .models import User 5 | 6 | 7 | def authenticate_request(request): 8 | auth_header = request.headers.get('Authorization') 9 | print('Request Header :: ',auth_header) 10 | try: 11 | role = json.loads(request.body.decode('utf-8')).get('role') 12 | except: 13 | pass 14 | 15 | if not auth_header: 16 | return None 17 | 18 | if not auth_header.startswith('Bearer '): 19 | return None 20 | 21 | token = auth_header.split(' ')[1] 22 | decoded_payload = decode_jwt_payload(json.loads(token).get('access')) 23 | 24 | if decoded_payload: 25 | user_id = decoded_payload.get('user_id') 26 | try: 27 | user = User.objects.get(id=user_id) 28 | return True 29 | except: 30 | return None 31 | else: 32 | return None 33 | 34 | 35 | 36 | class IsAuthenticatedWithToken(BasePermission): 37 | def has_permission(self, request, view): 38 | jwt_payload = authenticate_request(request) 39 | return jwt_payload is not None -------------------------------------------------------------------------------- /Backend/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL configuration for Backend project. 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/4.2/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.urls import include, path 15 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 16 | """ 17 | from django.contrib import admin 18 | from django.urls import path,include 19 | from django.conf import settings 20 | from django.conf.urls.static import static 21 | urlpatterns = [ 22 | path('admin/', admin.site.urls), 23 | path('api/',include('Account.urls')), 24 | path('home/',include('Home.urls')), 25 | path('post/',include('Post.urls')), 26 | path('message/',include('Message.urls')), 27 | ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 28 | -------------------------------------------------------------------------------- /Message/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .views import * 3 | from .views2 import * 4 | 5 | urlpatterns = [ 6 | 7 | path('questions/', QuestionListView.as_view(), name='question-list'), 8 | path('/solutions/', SolutionListView.as_view(), name='solution-list'), 9 | path('create-questions/', CreateQuestionView.as_view()), 10 | path('create-solutions/', CreateAnswerView.as_view()), 11 | path('/question-delete/', DeleteQuestionView.as_view()), 12 | path('solution-delete//', DeleteSolutionView.as_view()), 13 | path('admin-notifications//', NotificationListView.as_view()), 14 | path('user-notifications/',UserNotificationListView.as_view()), 15 | path('send-notifications/',AdminNotificationCreateView.as_view()), 16 | path('delete-notification//', DeleteNotificationAPIView.as_view()), 17 | path("user-previous-chats///", PreviousMessagesView.as_view()), 18 | path('cached-news/', CachedNewsListView.as_view(), name='cached-news-list'), 19 | path('fetch-initial-news/', FetchAndStoreInitialNews.as_view(), name='fetch-initial-news'), 20 | 21 | 22 | 23 | ] 24 | 25 | 26 | -------------------------------------------------------------------------------- /Message/migrations/0005_messages.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-23 11:06 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('Message', '0004_notification'), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='Messages', 18 | fields=[ 19 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 | ('message', models.TextField(blank=True, null=True)), 21 | ('thread_name', models.CharField(blank=True, max_length=200, null=True)), 22 | ('timestamp', models.DateField(auto_now_add=True)), 23 | ('receiver', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reciever_message', to=settings.AUTH_USER_MODEL)), 24 | ('sender', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sender_message', to=settings.AUTH_USER_MODEL)), 25 | ], 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /Message/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-14 18:19 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Question', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('question', models.TextField(blank=True)), 22 | ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 23 | ], 24 | ), 25 | migrations.CreateModel( 26 | name='Soluton', 27 | fields=[ 28 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 29 | ('answer', models.CharField(max_length=200)), 30 | ('quest', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Message.question')), 31 | ], 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /Post/signals.py: -------------------------------------------------------------------------------- 1 | from django.db.models.signals import post_save,post_delete 2 | 3 | from django.dispatch import receiver 4 | from .models import Follow 5 | from Account.models import * 6 | 7 | 8 | 9 | @receiver(post_save,sender=Follow) 10 | def update_follow_counts(sender,instane,created,**kwargs): 11 | if created: 12 | followed_user=instane.followed_user 13 | following_user=instane.following_user 14 | 15 | followed_user_profile=User.objects.get(user=followed_user) 16 | followed_user_profile.followers_count +=1 17 | followed_user_profile.save() 18 | 19 | 20 | following_user_profile=User.objects.get(user=following_user) 21 | following_user_profile.following_count +=1 22 | following_user_profile.save() 23 | 24 | 25 | @ receiver(post_delete,sender=Follow) 26 | def udpate_follow_count_on_delete(sender,instance,**kwargs): 27 | followed_user=instance.followed_user 28 | following_user=instance.following_user 29 | 30 | 31 | followed_user_profile=User.objects.get(user=followed_user) 32 | followed_user_profile.followers_count -=1 33 | followed_user_profile.save() 34 | 35 | 36 | following_user_profile=User.objects.get(user=following_user) 37 | following_user_profile.following_count -=1 38 | following_user_profile.save() 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Account/helpers.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import json 3 | from rest_framework.permissions import BasePermission 4 | from django.contrib.auth import get_user_model 5 | import json 6 | from .models import User 7 | 8 | User = get_user_model() 9 | 10 | def decode_jwt_payload(token): 11 | try: 12 | _, payload_base64, _ = token.split('.') 13 | payload_bytes = base64.urlsafe_b64decode(payload_base64 + '==') 14 | payload_json = payload_bytes.decode('utf-8') 15 | return json.loads(payload_json) 16 | except ValueError: 17 | return None 18 | 19 | 20 | def authenticate_user(request,role): 21 | 22 | auth_header=request.headers.get('Authorization') 23 | 24 | print(auth_header) 25 | if not auth_header: 26 | return None 27 | 28 | if not auth_header.startswith('Bearer'): 29 | return None 30 | 31 | 32 | token=auth_header.split(' ')[1] 33 | decoded_payload=decode_jwt_payload(json.loads(token).get('access')) 34 | if decoded_payload: 35 | user_id=decoded_payload.get('user_id') 36 | try: 37 | user=User.objects.get(id=user_id) 38 | except Exception as e: 39 | return None 40 | 41 | if role=='user': 42 | return True 43 | elif role=='admin': 44 | return True 45 | else: 46 | return None 47 | return None 48 | 49 | 50 | -------------------------------------------------------------------------------- /Home/migrations/0004_alter_banner_options_alter_member_options_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-27 05:31 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('Home', '0003_member_is_list_quote_is_list'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterModelOptions( 17 | name='banner', 18 | options={'verbose_name': 'Banner'}, 19 | ), 20 | migrations.AlterModelOptions( 21 | name='member', 22 | options={'verbose_name': 'Member'}, 23 | ), 24 | migrations.AlterModelOptions( 25 | name='quote', 26 | options={'verbose_name': 'Quote'}, 27 | ), 28 | migrations.CreateModel( 29 | name='Review', 30 | fields=[ 31 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 32 | ('message', models.TextField()), 33 | ('rate', models.IntegerField(default=0)), 34 | ('created_at', models.DateTimeField(auto_now_add=True)), 35 | ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 36 | ], 37 | ), 38 | ] 39 | -------------------------------------------------------------------------------- /Home/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-21 05:33 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Banner', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('title', models.CharField(blank=True, max_length=50, null=True)), 19 | ('img', models.ImageField(default='default.jpg', upload_to='userprofile')), 20 | ('is_list', models.BooleanField(default=False)), 21 | ], 22 | ), 23 | migrations.CreateModel( 24 | name='Member', 25 | fields=[ 26 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 27 | ('title', models.CharField(blank=True, max_length=50, null=True)), 28 | ('img', models.ImageField(default='default.jpg', upload_to='userprofile')), 29 | ], 30 | ), 31 | migrations.CreateModel( 32 | name='Quote', 33 | fields=[ 34 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 35 | ('content', models.TextField(blank=True)), 36 | ('Author', models.CharField(blank=True, max_length=20, null=True)), 37 | ], 38 | ), 39 | ] 40 | -------------------------------------------------------------------------------- /Message/serializer.py: -------------------------------------------------------------------------------- 1 | from .models import * 2 | from rest_framework import serializers 3 | from Account.serilizer import * 4 | from rest_framework.serializers import SerializerMethodField 5 | 6 | 7 | 8 | 9 | class QuestionSerializer(serializers.ModelSerializer): 10 | user=UserSerializer() 11 | 12 | class Meta: 13 | model=Question 14 | fields='__all__' 15 | 16 | 17 | class SolutionSerializer(serializers.ModelSerializer): 18 | 19 | user=UserSerializer() 20 | 21 | class Meta: 22 | model=Solution 23 | fields='__all__' 24 | 25 | 26 | class CreateQuestionSerializer(serializers.ModelSerializer): 27 | 28 | class Meta: 29 | model=Question 30 | fields='__all__' 31 | 32 | class createSolutionSerializer(serializers.ModelSerializer): 33 | class Meta: 34 | model=Solution 35 | fields='__all__' 36 | 37 | 38 | class NotificationSerializer(serializers.ModelSerializer): 39 | user=AdminProfileSerializer() 40 | class Meta: 41 | model=Notification 42 | fields='__all__' 43 | 44 | class CreateNotificationSerializer(serializers.ModelSerializer): 45 | class Meta: 46 | model=Notification 47 | fields='__all__' 48 | 49 | class MessageSerializer(serializers.ModelSerializer): 50 | sender_username=SerializerMethodField() 51 | 52 | class Meta: 53 | model=Messages 54 | fields=['message','sender_username'] 55 | 56 | def get_sender_username(self,obj): 57 | return obj.sender.username 58 | 59 | class ChatListSerializer(serializers.ModelSerializer): 60 | 61 | user_profile=SerializerMethodField 62 | username=SerializerMethodField 63 | 64 | class Meta: 65 | model=Messages 66 | fields=['user_profile','username'] 67 | 68 | def get_username(self,obj): 69 | return obj 70 | 71 | def get_user_profile(self,obj): 72 | return UserProfileSerializer(User.objects.filter(user__username=obj).first()).data.get('pic') 73 | 74 | 75 | -------------------------------------------------------------------------------- /Message/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from Account.models import * 3 | # Create your models here. 4 | 5 | 6 | class Question(models.Model): 7 | question=models.TextField(blank=True) 8 | user=models.ForeignKey(User,on_delete=models.CASCADE,null=True) 9 | 10 | 11 | 12 | class Meta: 13 | verbose_name='Question' 14 | 15 | def __str__(self) : 16 | return self.question 17 | 18 | 19 | class Solution(models.Model): 20 | answer=models.CharField(max_length=200) 21 | quest=models.ForeignKey(Question,on_delete=models.CASCADE) 22 | user=models.ForeignKey(User,on_delete=models.CASCADE,null=True) 23 | 24 | class Meta: 25 | verbose_name='Solution' 26 | 27 | def __str__(self): 28 | return self.answer 29 | 30 | 31 | class Notification(models.Model): 32 | message=models.CharField( max_length=200,blank=True) 33 | user=models.ForeignKey(User,on_delete=models.CASCADE,null=True) 34 | date=models.DateTimeField(auto_now_add=True) 35 | 36 | class Messages(models.Model): 37 | sender=models.ForeignKey(User,on_delete=models.CASCADE,null=True,blank=True,related_name='sender_message') 38 | receiver=models.ForeignKey(User,on_delete=models.CASCADE,null=True,blank=True,related_name='reciever_message') 39 | message=models.TextField(null=True,blank=True) 40 | thread_name=models.CharField(null=True,blank=True,max_length=200) 41 | timestamp=models.DateField(auto_now_add=True) 42 | 43 | 44 | def __str__(self) -> str: 45 | return f'{self.sender.username}-{self.thread_name}' if self.sender else f'{self.message}-{self.thread_name}' 46 | 47 | 48 | 49 | class News(models.Model): 50 | author=models.CharField(max_length=1000,null=True) 51 | title = models.CharField(max_length=1000,null=True) 52 | description = models.TextField(null=True) 53 | url = models.URLField(max_length=1000,null=True) 54 | url_to_image = models.URLField(max_length=1000,null=True) 55 | 56 | def __str__(self): 57 | return self.author -------------------------------------------------------------------------------- /Home/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from Account.models import User,Category 3 | 4 | # Create your models here. 5 | 6 | 7 | class Banner(models.Model): 8 | title=models.CharField(max_length=200,blank=True,null=True) 9 | img=models.ImageField(default='default.jpg', upload_to='Banner') 10 | is_list=models.BooleanField(default=False) 11 | 12 | class Meta: 13 | verbose_name='Banner' 14 | def __str__(self): 15 | return self.title 16 | 17 | 18 | 19 | 20 | class Quote(models.Model): 21 | content=models.TextField(blank=True) 22 | Author=models.CharField(max_length=20,null=True,blank=True) 23 | is_list=models.BooleanField(default=False) 24 | 25 | 26 | class Meta: 27 | verbose_name="Quote" 28 | 29 | def __str__(self): 30 | return self.Author 31 | 32 | class Member(models.Model): 33 | title=models.CharField( max_length=200,blank=True,null=True) 34 | img=models.ImageField(default='default.jpg',upload_to='Member') 35 | is_list=models.BooleanField(default=False) 36 | category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, null=True) 37 | 38 | class Meta: 39 | verbose_name='Member' 40 | 41 | def __str__(self): 42 | return self.title 43 | 44 | def unlist_associated_users(self): 45 | if self.category: 46 | associated_users = User.objects.filter(cat=self.category, is_active=True) 47 | for user in associated_users: 48 | user.is_active = False 49 | user.save() 50 | 51 | 52 | 53 | class Review(models.Model): 54 | user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reviews') 55 | message = models.TextField() 56 | rate = models.IntegerField(default=0) 57 | created_at = models.DateTimeField(auto_now_add=True) 58 | user1 = models.ForeignKey(User, on_delete=models.CASCADE,null=True, related_name='additional_reviews') 59 | 60 | def __str__(self) : 61 | return self.message 62 | 63 | -------------------------------------------------------------------------------- /Account/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from .views import RegisterView 3 | from .import views 4 | from .views import MyTokenObtainPairView 5 | from rest_framework_simplejwt.views import (TokenObtainPairView,TokenRefreshView) 6 | from .import views2 7 | urlpatterns = [ 8 | path('', views.getRoutes), 9 | path('token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'), 10 | path('google_authentication/',views.GoogleAuthentication.as_view()), 11 | path('register/',RegisterView.as_view()), 12 | path('activate// ', views.Activate, name='activate'), 13 | path('is-user/',views2.is_user), 14 | path('is-admin/',views2.is_admin), 15 | 16 | path('forgot_password/', views.ForgotPasswordView.as_view(), name='forgot_password'), 17 | path('resetPassword_validate///',views.ResetPassword_validate,name='resetPassword_validate'), 18 | path('resetPassword/',views.ResetPasswordView.as_view(), name='reset_password'), 19 | 20 | # admin side 21 | path('blockUser//',views.BlockUser.as_view()) , 22 | # path('send-notification/', views2.SendNotificationEmail.as_view()), 23 | path('listUser/', views.ListUserview.as_view()), 24 | path('adminsearchUser/', views.AdminSearchUser.as_view()), 25 | 26 | 27 | # # user Details 28 | 29 | path('getuserdetails//',views.GetUserDetails.as_view(),name='UserDetails'), 30 | path('getsingledetails//',views.GetUserDetails.as_view(),name='UserDetails'), 31 | path('profile-setup1//', views.userProfileSet1.as_view()), 32 | path('profile-setup2/', views.userProfileSet2.as_view()), 33 | path('update-profile//', views2.UserProfileUpdateView.as_view(), name='update-profile'), 34 | path('category-occupation-list/', views2.CategoryOccupationListView.as_view(), name='category-occupation-list'), 35 | path('update_address//', views2.AddressUpdateView.as_view(), name='update-address'), 36 | path('check-profile-setup//', views2.check_profile_setup, name='check_profile_setup'), 37 | path('get-new-token', views.get_new_token), 38 | path('admin-profiles//', views2.AdminProfileDetailView.as_view()), 39 | ] -------------------------------------------------------------------------------- /Home/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from django.urls import path 4 | from .import views 5 | from .import views2 6 | 7 | 8 | 9 | urlpatterns = [ 10 | path('banner-list/',views.getBannerLIst.as_view()), 11 | path('Admin-banner/',views.getAdminBannerLIst.as_view()), 12 | path('banner//list_unlist/',views.ListUnlistBanner.as_view()), 13 | path('banner/delete//',views.bannerDelete), 14 | path('banner/add/',views.BannerCreateView.as_view()), 15 | path('banner//Edit',views.BannerEditView.as_view()), 16 | 17 | path('quote-list/',views.getQuoteLIst.as_view()), 18 | path('Admin-quote/',views.getAdminquote.as_view()), 19 | path('quote/delete//',views.quoteDelete), 20 | path('quote/add/',views.QuoteCreateView.as_view()), 21 | path('quote//list_unlist/',views.ListUnlist.as_view()), 22 | path('quote/update//',views.QuoteUpdate.as_view()), 23 | 24 | 25 | 26 | path('member-list/',views.getMemberLIst.as_view()), 27 | path('member//list_unlist/',views.ListUnlistMember.as_view()), 28 | path('Admin-member/',views.getAdminMember.as_view()), 29 | path('member/delete//',views.memberDelete), 30 | path('member/add/',views.MemberCreateView.as_view()), 31 | path('member//Edit/',views.MemberEditView.as_view()), 32 | 33 | 34 | path('users/category//', views2.UserByCategoryView.as_view(), name='users-by-category'), 35 | path('users/search//', views2.SearchUsersByCategory.as_view(), name='search-users-by-category'), 36 | path('users/auto-suggest//', views2.AutoSuggestUsers.as_view(), name='auto-suggest'), 37 | path('getuserinfo//',views2.GetUserinfo.as_view(),name='UserDetails'), 38 | 39 | 40 | # path('reviews/', views2.AllReviewsListView.as_view()), 41 | 42 | path('/reviews/', views2.User1ReviewsListView.as_view()), 43 | path('/singlereview/', views2.User1Reviews.as_view()), 44 | 45 | path('create-review/', views2.User1CreateReviews.as_view(), name='user1-reviews'), 46 | 47 | path('/delete-review/', views2.ReviewDeleteView.as_view()), 48 | 49 | 50 | 51 | ] 52 | 53 | -------------------------------------------------------------------------------- /Post/serializer.py: -------------------------------------------------------------------------------- 1 | from .models import * 2 | from rest_framework import serializers 3 | from Account.serilizer import * 4 | from rest_framework.serializers import SerializerMethodField 5 | 6 | 7 | 8 | class PostSerializer(serializers.ModelSerializer): 9 | 10 | user = UserSerializer() 11 | is_liked = SerializerMethodField() 12 | 13 | 14 | class Meta: 15 | model=Post 16 | fields=['id', 'title', 'description', 'image', 'date', 'user','comment_count','like_count','Location','is_liked'] 17 | 18 | 19 | def get_is_liked(self,obj): 20 | user = User.objects.get(id=self.context.get('user_id')) 21 | print(Like.objects.filter(user=user,post=obj)) 22 | return Like.objects.filter(user=user,post=obj).exists() 23 | 24 | 25 | class PostUserSerializer(serializers.ModelSerializer): 26 | user = UserSerializer() 27 | is_liked = SerializerMethodField() 28 | 29 | class Meta: 30 | model = Post 31 | fields = ['id', 'title', 'description', 'image', 'date', 'user', 'comment_count', 'like_count', 'Location', 'is_liked'] 32 | 33 | def get_is_liked(self, obj): 34 | username = self.context.get('username') 35 | if username is not None: 36 | try: 37 | user = User.objects.get(username=username) 38 | return Like.objects.filter(user=user, post=obj).exists() 39 | except User.DoesNotExist: 40 | return False 41 | return False 42 | 43 | 44 | class CommentSerializer(serializers.ModelSerializer): 45 | userdetails=serializers.SerializerMethodField() 46 | class Meta: 47 | model=Comments 48 | fields='__all__' 49 | extra_kwargs={ 50 | 'user':{'write_only':True} 51 | } 52 | def get_userdetails(self,obj): 53 | userdetails = {} 54 | userdetails.update(username=UserSerializer(obj.user).data.get('username')) 55 | userdetails.update(pic=UserSerializer(obj.user).data.get('pic')) 56 | return userdetails 57 | 58 | 59 | class AddPostSerializer(serializers.ModelSerializer): 60 | class Meta: 61 | model = Post 62 | fields = '__all__' 63 | 64 | 65 | 66 | class LikeSerializer(serializers.ModelSerializer): 67 | class Meta: 68 | model=Like 69 | fields='__all__' 70 | 71 | 72 | class FollowSerializer(serializers.ModelSerializer): 73 | class Meta: 74 | model=Follow 75 | fields="__all__" -------------------------------------------------------------------------------- /Post/views2.py: -------------------------------------------------------------------------------- 1 | from django.db.models import Count 2 | from django.shortcuts import render 3 | from rest_framework.views import APIView 4 | from rest_framework.generics import UpdateAPIView,ListAPIView,CreateAPIView,DestroyAPIView,ListCreateAPIView 5 | from .models import * 6 | from .serializer import * 7 | from rest_framework.response import Response 8 | from rest_framework import status 9 | from rest_framework.decorators import api_view 10 | from rest_framework import generics 11 | from Account.permision import IsAuthenticatedWithToken 12 | from rest_framework.permissions import IsAuthenticated 13 | from rest_framework import viewsets 14 | 15 | 16 | class FollowView(APIView): 17 | def get(self,request,user1,user2): 18 | instance=Follow.objects.filter(following_user__id=user1,followed_user__id=user2) 19 | is_followed=True if instance.exists() else False 20 | status_code=200 if is_followed else 404 21 | 22 | 23 | follower_count = Follow.objects.filter(followed_user__id=user1).count() 24 | following_count = Follow.objects.filter(following_user__id=user2).count() 25 | 26 | print('status===',status_code) 27 | return Response(data={"is_followed":is_followed, 28 | "follower_count": follower_count, 29 | "following_count": following_count, 30 | 31 | },status=status_code) 32 | 33 | def post(self, request, user1, user2): 34 | 35 | try: 36 | following_user = User.objects.get(id=user1) 37 | followed_user = User.objects.get(id=user2) 38 | 39 | 40 | if Follow.objects.filter(following_user=following_user, followed_user=followed_user).exists(): 41 | return Response(status=400, data={'error': 'Already following this user'}) 42 | 43 | Follow.objects.create( 44 | following_user=following_user, followed_user=followed_user 45 | ) 46 | except Exception as e: 47 | print(e,'eeeeeeeeeeeeeeeeeeeeeeeee') 48 | return Response(status=400, data={'error': str(e)}) 49 | return Response(status=201) 50 | 51 | 52 | def delete(self,request,user1,user2): 53 | instance=Follow.objects.filter( 54 | following_user__id=user1,followed_user__id=user2 55 | ) 56 | if instance.exists(): 57 | instance.delete() 58 | return Response(status=200) 59 | 60 | -------------------------------------------------------------------------------- /Post/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from Account.models import User 3 | from django.db.models import F 4 | from django.db.models.signals import post_save, post_delete 5 | from django.dispatch import receiver 6 | # Create your models here. 7 | 8 | class Post(models.Model): 9 | image=models.ImageField(upload_to="post_img/",null=True,blank=True) 10 | title=models.CharField(max_length=100,null=True) 11 | description=models.TextField(blank=True) 12 | date=models.DateTimeField(auto_now_add=True) 13 | like_count=models.PositiveIntegerField(default=0) 14 | comment_count=models.PositiveIntegerField(default=0) 15 | Location=models.CharField(max_length=100,null=True) 16 | user=models.ForeignKey(User,on_delete=models.CASCADE,blank=True) 17 | 18 | class Meta: 19 | verbose_name='Post' 20 | 21 | def __str__(self): 22 | return self.title 23 | 24 | 25 | class Comments(models.Model): 26 | comment=models.TextField(blank=True) 27 | post=models.ForeignKey(Post,on_delete=models.CASCADE,blank=True) 28 | user = models.ForeignKey(User, on_delete=models.CASCADE,null=True) 29 | 30 | class Meta: 31 | verbose_name='Comment' 32 | 33 | def __str__(self): 34 | return self.comment 35 | 36 | class Like(models.Model): 37 | post=models.ForeignKey(Post,on_delete=models.CASCADE,null=True) 38 | user=models.ForeignKey(User,on_delete=models.CASCADE,null=True) 39 | 40 | class Meta: 41 | unique_together=["post","user"] 42 | 43 | def __str__(self) -> str: 44 | return f"{self.user} liked on {self.post}" 45 | 46 | class Follow(models.Model): 47 | following_user=models.ForeignKey(User,on_delete=models.CASCADE,related_name='following_user') 48 | followed_user=models.ForeignKey(User,on_delete=models.CASCADE,related_name='followed_user') 49 | 50 | 51 | class Meta: 52 | unique_together=['following_user','followed_user'] 53 | 54 | def __str__(self) -> str: 55 | return f"{self.following_user} followed {self.followed_user}" 56 | 57 | 58 | 59 | @receiver(post_save, sender=Like) 60 | def update_post_like_count(sender, instance, **kwargs): 61 | post = instance.post 62 | post.like_count = Like.objects.filter(post=post).count() 63 | post.save() 64 | 65 | @receiver(post_save, sender=Comments) 66 | def update_post_comments_count(sender, instance, **kwargs): 67 | post = instance.post 68 | post.comment_count = Comments.objects.filter(post=post).count() 69 | post.save() 70 | 71 | 72 | @receiver(post_delete,sender=Like) 73 | def update_post_like_count_on_delete(sender,instance,**kwargs): 74 | post=instance.post 75 | post.like_count=Like.objects.filter(post=post).count() 76 | post.save() 77 | 78 | @receiver(post_delete,sender=Comments) 79 | def update_post_comment_count_on_delete(sender,instance,**Kwargs): 80 | post=instance.post 81 | post.comment_count=Comments.objects.filter(post=post).count() 82 | post.save() 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Account/serilizer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import * 3 | 4 | class UpdateUserProfileSerializer(serializers.ModelSerializer): 5 | 6 | class Meta: 7 | model=User 8 | fields=['pic','cover','username'] 9 | 10 | 11 | 12 | class AccountSerilizer(serializers.ModelSerializer): 13 | class Meta: 14 | model = Address 15 | fields = '__all__' 16 | 17 | def create(self, validated_data): 18 | instance = Address.objects.create(**validated_data) 19 | user_instance = instance.user 20 | user_instance.is_setup_complete = True 21 | user_instance.save() 22 | return instance 23 | 24 | 25 | class CategorySerilizer(serializers.ModelSerializer): 26 | 27 | class Meta: 28 | model=Category 29 | fields='__all__' 30 | 31 | 32 | class OccupationSerilizer(serializers.ModelSerializer): 33 | 34 | class Meta: 35 | model=Occupation 36 | fields='__all__' 37 | 38 | class GoogleAuthSerializer(serializers.ModelSerializer): 39 | class Meta: 40 | model=User 41 | fields='__all__' 42 | 43 | 44 | class UserProfileSerializer(serializers.ModelSerializer): 45 | 46 | class Meta: 47 | model=User 48 | fields=['pic','cover','Occup','cat'] 49 | 50 | 51 | 52 | 53 | class UserRegister(serializers.ModelSerializer): 54 | class Meta: 55 | model=User 56 | fields='__all__' 57 | extra_kwargs = { 58 | 'password': {'write_only': True} 59 | } 60 | 61 | def create(self,validate_data): 62 | password=validate_data.pop('password',None) 63 | instance=self.Meta.model(**validate_data) 64 | if password is not None: 65 | instance.set_password(password) 66 | instance.save() 67 | return instance 68 | 69 | 70 | 71 | 72 | 73 | class CategorySerilizer(serializers.ModelSerializer): 74 | 75 | class Meta: 76 | model=Category 77 | fields='__all__' 78 | 79 | 80 | class OccupationSerilizer(serializers.ModelSerializer): 81 | 82 | class Meta: 83 | model=Occupation 84 | fields='__all__' 85 | 86 | 87 | 88 | 89 | 90 | 91 | class UserSerializer(serializers.ModelSerializer): 92 | 93 | 94 | 95 | Occup = OccupationSerilizer() 96 | cat = CategorySerilizer() 97 | 98 | class Meta: 99 | model=User 100 | fields='__all__' 101 | extra_kwargs = { 102 | 'password': {'write_only': True} 103 | } 104 | 105 | 106 | 107 | class getProfileSerializer(serializers.ModelSerializer): 108 | class Meta: 109 | model = User 110 | fields = ['id', 'username'] 111 | 112 | class AdminProfileSerializer(serializers.ModelSerializer): 113 | class Meta: 114 | model=User 115 | fields=['username','email','pic','cover','phone_number','id'] 116 | 117 | 118 | -------------------------------------------------------------------------------- /Account/migrations/0011_alter_address_city_alter_address_country_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-28 11:40 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('Account', '0010_alter_occupation_cat'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='address', 17 | name='city', 18 | field=models.CharField(blank=True, max_length=200), 19 | ), 20 | migrations.AlterField( 21 | model_name='address', 22 | name='country', 23 | field=models.CharField(blank=True, max_length=150), 24 | ), 25 | migrations.AlterField( 26 | model_name='address', 27 | name='default', 28 | field=models.BooleanField(blank=True, default=False), 29 | ), 30 | migrations.AlterField( 31 | model_name='address', 32 | name='district', 33 | field=models.CharField(blank=True, max_length=100), 34 | ), 35 | migrations.AlterField( 36 | model_name='address', 37 | name='house_name', 38 | field=models.CharField(blank=True, max_length=250), 39 | ), 40 | migrations.AlterField( 41 | model_name='address', 42 | name='landmark', 43 | field=models.CharField(blank=True, max_length=100), 44 | ), 45 | migrations.AlterField( 46 | model_name='address', 47 | name='pincode', 48 | field=models.IntegerField(blank=True), 49 | ), 50 | migrations.AlterField( 51 | model_name='address', 52 | name='state', 53 | field=models.CharField(blank=True, max_length=200), 54 | ), 55 | migrations.AlterField( 56 | model_name='address', 57 | name='user', 58 | field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), 59 | ), 60 | migrations.AlterField( 61 | model_name='user', 62 | name='email', 63 | field=models.EmailField(blank=True, max_length=100, unique=True), 64 | ), 65 | migrations.AlterField( 66 | model_name='user', 67 | name='first_name', 68 | field=models.CharField(blank=True, max_length=50), 69 | ), 70 | migrations.AlterField( 71 | model_name='user', 72 | name='last_name', 73 | field=models.CharField(blank=True, max_length=50), 74 | ), 75 | migrations.AlterField( 76 | model_name='user', 77 | name='phone_number', 78 | field=models.CharField(blank=True, max_length=50), 79 | ), 80 | migrations.AlterField( 81 | model_name='user', 82 | name='username', 83 | field=models.CharField(blank=True, max_length=50), 84 | ), 85 | ] 86 | -------------------------------------------------------------------------------- /Message/consumers.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from channels.db import database_sync_to_async 4 | from channels.generic.websocket import AsyncJsonWebsocketConsumer 5 | from django.contrib.auth import get_user_model 6 | from .serializer import MessageSerializer 7 | from .models import Messages 8 | from Account.models import * 9 | 10 | 11 | 12 | class ChatConsumer(AsyncJsonWebsocketConsumer): 13 | async def connect(self): 14 | current_user_id=int(self.scope['query_string']) 15 | other_user_id=self.scope['url_route']['kwargs']['id'] 16 | self.room_name=f'{current_user_id}_{other_user_id}' \ 17 | if int(current_user_id)>int(other_user_id) \ 18 | else f'{other_user_id}_{current_user_id}' 19 | 20 | self.room_group_name=f'chat_{self.room_name}' 21 | 22 | await self.channel_layer.group_add(self.room_group_name,self.channel_name) 23 | await self.accept() 24 | 25 | async def disconnect(self, close_code): 26 | await self.channel_layer.group_discard(self.room_group_name,self.channel_name) 27 | await super().disconnect(close_code) 28 | 29 | 30 | async def receive(self, text_data=None, bytes_data=None): 31 | data=json.loads(text_data) 32 | message=data['message'] 33 | sender_username=data['senderUsername'] 34 | receiver_username=data['receiverUsername'] 35 | print('receiver name',receiver_username) 36 | print('sendername',sender_username) 37 | 38 | 39 | 40 | await self.save_message( 41 | sender_username=sender_username, receiver_username=receiver_username, message=message, thread_name=self.room_group_name 42 | ) 43 | 44 | await self.channel_layer.group_send( 45 | self.room_group_name, 46 | 47 | { 48 | 'type':"chat_message", 49 | 'message':message, 50 | 'senderUsername':sender_username, 51 | 52 | }, 53 | 54 | ) 55 | async def chat_message(self,event): 56 | message=event['message'] 57 | username=event['senderUsername'] 58 | 59 | await self.send( 60 | text_data=json.dumps( 61 | { 62 | 'message':message, 63 | 'senderUsername':username, 64 | 'messages':message, 65 | 66 | } 67 | ) 68 | ) 69 | 70 | 71 | 72 | @database_sync_to_async 73 | def get_messages(self): 74 | messages = [] 75 | for instance in Messages.objects.filter(thread_name=self.room_group_name): 76 | messages = MessageSerializer(instance).data 77 | return messages 78 | 79 | @database_sync_to_async 80 | def save_message(self, sender_username,receiver_username, message, thread_name): 81 | sender_instance=User.objects.get(username=sender_username) 82 | reciever_instance=User.objects.get(username=receiver_username) 83 | print(sender_username,'sender_username') 84 | print(receiver_username,'receiver_username') 85 | Messages.objects.create(sender=sender_instance, receiver=reciever_instance, message=message, thread_name=thread_name) 86 | 87 | -------------------------------------------------------------------------------- /Post/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-08-23 12:13 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Post', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('image', models.ImageField(blank=True, null=True, upload_to='post_img/')), 22 | ('title', models.CharField(max_length=100, null=True)), 23 | ('description', models.TextField(blank=True)), 24 | ('date', models.DateTimeField(auto_now_add=True)), 25 | ('like_count', models.PositiveIntegerField(default=0)), 26 | ('comment_count', models.PositiveIntegerField(default=0)), 27 | ('Location', models.CharField(max_length=100, null=True)), 28 | ('user', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 29 | ], 30 | options={ 31 | 'verbose_name': 'Post', 32 | }, 33 | ), 34 | migrations.CreateModel( 35 | name='Comments', 36 | fields=[ 37 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 38 | ('comment', models.TextField(blank=True)), 39 | ('post', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='Post.post')), 40 | ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 41 | ], 42 | options={ 43 | 'verbose_name': 'Comment', 44 | }, 45 | ), 46 | migrations.CreateModel( 47 | name='Like', 48 | fields=[ 49 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 50 | ('post', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='Post.post')), 51 | ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 52 | ], 53 | options={ 54 | 'unique_together': {('post', 'user')}, 55 | }, 56 | ), 57 | migrations.CreateModel( 58 | name='Follow', 59 | fields=[ 60 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 61 | ('followed_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='followed_user', to=settings.AUTH_USER_MODEL)), 62 | ('following_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='following_user', to=settings.AUTH_USER_MODEL)), 63 | ], 64 | options={ 65 | 'unique_together': {('following_user', 'followed_user')}, 66 | }, 67 | ), 68 | ] 69 | -------------------------------------------------------------------------------- /Message/views2.py: -------------------------------------------------------------------------------- 1 | from rest_framework.views import APIView 2 | from rest_framework.generics import * 3 | from rest_framework.response import Response 4 | from rest_framework import status 5 | from .models import * 6 | from .serializer import * 7 | from django.db.utils import IntegrityError 8 | import requests 9 | from rest_framework import status 10 | from django.conf import settings 11 | 12 | 13 | 14 | 15 | class PreviousMessagesView(ListAPIView): 16 | serializer_class = MessageSerializer 17 | 18 | def get_queryset(self): 19 | user1 = int(self.kwargs['user1']) 20 | user2 = int(self.kwargs['user2']) 21 | 22 | thread_suffix = f"{user1}_{user2}" if user1 > user2 else f"{user2}_{user1}" 23 | thread_name = 'chat_'+thread_suffix 24 | queryset = Messages.objects.filter( 25 | thread_name=thread_name 26 | ) 27 | return queryset 28 | 29 | 30 | 31 | class FetchAndStoreInitialNews(APIView): 32 | def post(self, request, format=None): 33 | try: 34 | 35 | api_key = settings.API_KEY 36 | api_url = f'https://newsapi.org/v2/everything?q=agriculture&apikey={api_key}' 37 | response = requests.get(api_url) 38 | print(response) 39 | news_data = response.json().get('articles',[]) 40 | 41 | if not news_data: 42 | print("API response does not contain news data. Skipping addition.") 43 | return Response({'message': 'API response does not contain news data.'}) 44 | 45 | News.objects.all().delete() 46 | print("Cleared existing news data") 47 | 48 | news_added = 0 49 | max_news_count = 100 50 | 51 | for article in news_data: 52 | if news_added >= max_news_count: 53 | print("Maximum news limit reached. Stopping further addition.") 54 | break 55 | try: 56 | News.objects.create( 57 | author=article['author'], 58 | title=article['title'], 59 | description=article['description'], 60 | url=article['url'], 61 | url_to_image=article['urlToImage'], 62 | ) 63 | news_added += 1 64 | except IntegrityError as e: 65 | print('Error adding news article:', exc_info=True) 66 | continue 67 | 68 | 69 | return Response({'message': 'News data fetched and stored successfully.'}, status=status.HTTP_200_OK) 70 | except Exception as e: 71 | return Response({'message': 'Error fetching and storing news data.'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) 72 | 73 | 74 | 75 | class CachedNewsListView(APIView): 76 | def get(self, request, *args, **kwargs): 77 | 78 | cache_time_threshold = datetime.now() - timedelta(days=1) 79 | cached_news = News.objects.all().order_by('-id') 80 | 81 | if cached_news.exists(): 82 | serialized_news = [{'title': news.title, 'description': news.description, 'url': news.url, 'urlToImage': news.url_to_image,'author':news.author} for news in cached_news] 83 | return Response(serialized_news) 84 | else: 85 | return Response({'message': 'No cached news data available.'}, status=204) 86 | -------------------------------------------------------------------------------- /Message/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework.views import APIView 2 | from rest_framework.generics import UpdateAPIView,CreateAPIView,DestroyAPIView,ListAPIView,ListCreateAPIView 3 | from rest_framework.response import Response 4 | from rest_framework import status 5 | from .models import Question,Solution,Notification 6 | from .serializer import QuestionSerializer, SolutionSerializer,CreateQuestionSerializer,createSolutionSerializer, NotificationSerializer,CreateNotificationSerializer 7 | 8 | 9 | class QuestionListView(APIView): 10 | def get(self, request): 11 | questions = Question.objects.all().order_by('-id') 12 | serializer = QuestionSerializer(questions, many=True) 13 | return Response(serializer.data, status=status.HTTP_200_OK) 14 | 15 | 16 | # class QuestionDetailView(APIView): 17 | # def get(self, request, question_id): 18 | # try: 19 | # question = Question.objects.get(pk=question_id) 20 | # except Question.DoesNotExist: 21 | # return Response({"error": "Question not found."}, status=status.HTTP_404_NOT_FOUND) 22 | 23 | # serializer = QuestionSerializer(question) 24 | # return Response(serializer.data, status=status.HTTP_200_OK) 25 | class SolutionListView(APIView): 26 | def get(self, request, question_id): 27 | solutions = Solution.objects.filter(quest=question_id).order_by('-id') 28 | serializer = SolutionSerializer(solutions, many=True) 29 | return Response(serializer.data, status=status.HTTP_200_OK) 30 | 31 | 32 | 33 | 34 | class CreateQuestionView(CreateAPIView): 35 | queryset = Question.objects.all() 36 | serializer_class = CreateQuestionSerializer 37 | 38 | 39 | 40 | class CreateAnswerView(CreateAPIView): 41 | queryset = Question.objects.all() 42 | serializer_class = createSolutionSerializer 43 | 44 | 45 | 46 | class DeleteQuestionView(APIView): 47 | def delete(self, request, question_id): 48 | try: 49 | question = Question.objects.get(id=question_id) 50 | question.delete() 51 | return Response(status=status.HTTP_204_NO_CONTENT) 52 | except Question.DoesNotExist: 53 | return Response({'error': 'Question not found'}, status=status.HTTP_404_NOT_FOUND) 54 | 55 | 56 | class DeleteSolutionView(APIView): 57 | 58 | def delete(self, request,solution_id): 59 | try: 60 | solution = Solution.objects.get(id=solution_id) 61 | solution.delete() 62 | return Response(status=status.HTTP_204_NO_CONTENT) 63 | except Solution.DoesNotExist: 64 | return Response({'error': 'Solution not found'}, status=status.HTTP_404_NOT_FOUND) 65 | 66 | 67 | 68 | 69 | class NotificationListView(ListAPIView): 70 | serializer_class = NotificationSerializer 71 | 72 | def get_queryset(self): 73 | user_id = self.kwargs['user_id'] 74 | return Notification.objects.filter(user_id=user_id).order_by('-date') 75 | 76 | 77 | class AdminNotificationCreateView(CreateAPIView): 78 | serializer_class = CreateNotificationSerializer 79 | queryset=Notification.objects.all() 80 | 81 | 82 | 83 | class DeleteNotificationAPIView(DestroyAPIView): 84 | queryset = Notification.objects.all() 85 | serializer_class = NotificationSerializer 86 | lookup_field='id' 87 | 88 | 89 | 90 | 91 | class UserNotificationListView(ListAPIView): 92 | queryset=Notification.objects.all().order_by('-date') 93 | serializer_class = NotificationSerializer 94 | 95 | 96 | -------------------------------------------------------------------------------- /Account/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.3 on 2023-07-13 16:19 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='Category', 18 | fields=[ 19 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 | ('Category_name', models.CharField(max_length=250, unique=True)), 21 | ], 22 | options={ 23 | 'verbose_name': 'OCcupation', 24 | }, 25 | ), 26 | migrations.CreateModel( 27 | name='Occupation', 28 | fields=[ 29 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 30 | ('titile', models.CharField(max_length=250, unique=True)), 31 | ('Cat', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Account.category')), 32 | ], 33 | options={ 34 | 'verbose_name': 'OCcupation', 35 | }, 36 | ), 37 | migrations.CreateModel( 38 | name='User', 39 | fields=[ 40 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 41 | ('password', models.CharField(max_length=128, verbose_name='password')), 42 | ('first_name', models.CharField(max_length=50)), 43 | ('last_name', models.CharField(max_length=50)), 44 | ('username', models.CharField(max_length=50, unique=True)), 45 | ('email', models.EmailField(max_length=100, unique=True)), 46 | ('phone_number', models.CharField(max_length=50)), 47 | ('pic', models.ImageField(blank=True, default='static/img/userprofile.jpg', null=True, upload_to='pro_pic/')), 48 | ('date_joined', models.DateTimeField(auto_now_add=True)), 49 | ('last_login', models.DateTimeField(auto_now_add=True)), 50 | ('is_admin', models.BooleanField(default=False)), 51 | ('is_staff', models.BooleanField(default=False)), 52 | ('is_active', models.BooleanField(default=False)), 53 | ('is_superadmin', models.BooleanField(default=False)), 54 | ('is_available', models.BooleanField(default=False)), 55 | ('Occup', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Account.occupation')), 56 | ], 57 | options={ 58 | 'abstract': False, 59 | }, 60 | ), 61 | migrations.CreateModel( 62 | name='Address', 63 | fields=[ 64 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 65 | ('house_name', models.CharField(max_length=250)), 66 | ('landmark', models.CharField(max_length=100)), 67 | ('pincode', models.IntegerField()), 68 | ('city', models.CharField(max_length=200)), 69 | ('district', models.CharField(max_length=100)), 70 | ('state', models.CharField(max_length=200)), 71 | ('country', models.CharField(max_length=150)), 72 | ('phone_number', models.CharField(max_length=100)), 73 | ('default', models.BooleanField(default=False)), 74 | ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 75 | ], 76 | ), 77 | ] 78 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | 3 | ### Django ### 4 | *.log 5 | *.pot 6 | *.pyc 7 | __pycache__/ 8 | local_settings.py 9 | media 10 | 11 | # If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ 12 | # in your Git repository. Update and uncomment the following line accordingly. 13 | # /staticfiles/ 14 | 15 | ### Django.Python Stack ### 16 | # Byte-compiled / optimized / DLL files 17 | *.py[cod] 18 | *$py.class 19 | 20 | # C extensions 21 | *.so 22 | 23 | # Distribution / packaging 24 | .Python 25 | build/ 26 | develop-eggs/ 27 | dist/ 28 | downloads/ 29 | eggs/ 30 | .eggs/ 31 | lib/ 32 | lib64/ 33 | parts/ 34 | sdist/ 35 | var/ 36 | wheels/ 37 | share/python-wheels/ 38 | *.egg-info/ 39 | .installed.cfg 40 | *.egg 41 | MANIFEST 42 | 43 | # PyInstaller 44 | # Usually these files are written by a python script from a template 45 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 46 | *.manifest 47 | *.spec 48 | 49 | # Installer logs 50 | pip-log.txt 51 | pip-delete-this-directory.txt 52 | 53 | # Unit test / coverage reports 54 | htmlcov/ 55 | .tox/ 56 | .nox/ 57 | .coverage 58 | .coverage.* 59 | .cache 60 | nosetests.xml 61 | coverage.xml 62 | *.cover 63 | *.py,cover 64 | .hypothesis/ 65 | .pytest_cache/ 66 | cover/ 67 | 68 | # Translations 69 | *.mo 70 | 71 | # Django stuff: 72 | 73 | # Flask stuff: 74 | instance/ 75 | .webassets-cache 76 | 77 | # Scrapy stuff: 78 | .scrapy 79 | 80 | # Sphinx documentation 81 | docs/_build/ 82 | 83 | # PyBuilder 84 | .pybuilder/ 85 | target/ 86 | 87 | # Jupyter Notebook 88 | .ipynb_checkpoints 89 | 90 | # IPython 91 | profile_default/ 92 | ipython_config.py 93 | 94 | # pyenv 95 | # For a library or package, you might want to ignore these files since the code is 96 | # intended to run in multiple environments; otherwise, check them in: 97 | # .python-version 98 | 99 | # pipenv 100 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 101 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 102 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 103 | # install all needed dependencies. 104 | #Pipfile.lock 105 | 106 | # poetry 107 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 108 | # This is especially recommended for binary packages to ensure reproducibility, and is more 109 | # commonly ignored for libraries. 110 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 111 | #poetry.lock 112 | 113 | # pdm 114 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 115 | #pdm.lock 116 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 117 | # in version control. 118 | # https://pdm.fming.dev/#use-with-ide 119 | .pdm.toml 120 | 121 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 122 | __pypackages__/ 123 | 124 | # Celery stuff 125 | celerybeat-schedule 126 | celerybeat.pid 127 | 128 | # SageMath parsed files 129 | *.sage.py 130 | 131 | # Environments 132 | .env 133 | .venv 134 | env/ 135 | venv/ 136 | ENV/ 137 | env.bak/ 138 | venv.bak/ 139 | 140 | # Spyder project settings 141 | .spyderproject 142 | .spyproject 143 | 144 | # Rope project settings 145 | .ropeproject 146 | 147 | # mkdocs documentation 148 | /site 149 | 150 | # mypy 151 | .mypy_cache/ 152 | .dmypy.json 153 | dmypy.json 154 | 155 | # Pyre type checker 156 | .pyre/ 157 | 158 | # pytype static type analyzer 159 | .pytype/ 160 | 161 | # Cython debug symbols 162 | cython_debug/ 163 | 164 | 165 | poetry.toml 166 | 167 | # ruff 168 | .ruff_cache/ 169 | 170 | # LSP config files 171 | pyrightconfig.json 172 | 173 | -------------------------------------------------------------------------------- /Account/views2.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.shortcuts import get_object_or_404 3 | from django.urls import reverse 4 | from django.contrib.sites.shortcuts import get_current_site 5 | from django.template.loader import render_to_string 6 | from django.utils.http import urlsafe_base64_decode,urlsafe_base64_encode 7 | from django.utils.encoding import force_bytes 8 | from django.contrib.auth.tokens import default_token_generator 9 | from django.core.mail import EmailMessage 10 | from django.http import HttpResponseRedirect 11 | from rest_framework import status 12 | from .tocken import create_jwt_pair_tokens 13 | from rest_framework.generics import UpdateAPIView 14 | 15 | from .models import * 16 | 17 | from rest_framework import serializers 18 | from rest_framework.views import APIView 19 | from rest_framework.generics import ListCreateAPIView,RetrieveAPIView 20 | from rest_framework.response import Response 21 | from .serilizer import * 22 | from rest_framework.decorators import api_view 23 | from rest_framework.generics import ListAPIView 24 | from rest_framework_simplejwt.serializers import TokenObtainPairSerializer 25 | from rest_framework_simplejwt.views import TokenObtainPairView 26 | from rest_framework.filters import SearchFilter 27 | from .helpers import authenticate_user 28 | from django.views.decorators.csrf import csrf_exempt 29 | from django.http import JsonResponse 30 | from django.core.mail import send_mail 31 | from django.conf import settings 32 | 33 | 34 | 35 | 36 | class CategoryOccupationListView(APIView): 37 | def get(self, request): 38 | category_id = request.query_params.get('category') 39 | 40 | # Fetch all categories 41 | categories=Category.objects.all() 42 | 43 | # If a category ID is provided in the request, filter occupations by that category 44 | if category_id: 45 | occupations = Occupation.objects.filter(Cat=category_id) 46 | else: 47 | # If no category ID is provided, return all occupations 48 | occupations = Occupation.objects.all() 49 | 50 | category_serializer = CategorySerilizer(categories, many=True) 51 | occupation_serializer =OccupationSerilizer(occupations, many=True) 52 | 53 | return Response({ 54 | 'categories': category_serializer.data, 55 | 'occupations': occupation_serializer.data 56 | }) 57 | 58 | class UserProfileUpdateView(UpdateAPIView): 59 | queryset = User.objects.all() 60 | serializer_class = UpdateUserProfileSerializer 61 | lookup_field = 'id' 62 | 63 | 64 | class AddressUpdateView(UpdateAPIView): 65 | queryset=Address.objects.all() 66 | serializer_class=AccountSerilizer 67 | lookup_field='user__id' 68 | 69 | 70 | @api_view(['GET']) 71 | def check_profile_setup(request,id): 72 | 73 | try: 74 | user = User.objects.get(id=id) 75 | is_setup_complete = user.is_setup_complete 76 | except: 77 | return Response({"Error": 'Some error occured'}) 78 | return Response({"is_setup_complete": is_setup_complete}) 79 | 80 | 81 | 82 | @api_view(["POST"]) 83 | @csrf_exempt 84 | def is_user(request): 85 | isVerified = authenticate_user(request, "user") 86 | 87 | print("user verification", isVerified) 88 | return JsonResponse(isVerified is not None, safe=False) 89 | 90 | 91 | @api_view(["POST"]) 92 | @csrf_exempt 93 | def is_admin(request): 94 | isVerified = authenticate_user(request, "admin") 95 | print("admin verification", isVerified) 96 | return JsonResponse(isVerified is not None, safe=False) 97 | 98 | 99 | # class AdminProfileDetailView(RetrieveAPIView): 100 | # serializer_class = AdminProfileSerializer 101 | 102 | # def get_queryset(self): 103 | # return User.objects.filter(is_admin=True, is_staff=True) 104 | 105 | 106 | class AdminProfileDetailView(APIView): 107 | def get(self, request, user_id): 108 | user = User.objects.get(id=user_id) 109 | serializer = AdminProfileSerializer(user) 110 | return Response(data=serializer.data) 111 | 112 | -------------------------------------------------------------------------------- /Account/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import AbstractBaseUser,BaseUserManager 3 | from datetime import datetime, timedelta 4 | from django.db.models.signals import pre_save,post_save 5 | from django.dispatch import receiver 6 | from django.core.mail import send_mail 7 | from django.conf import settings 8 | 9 | # Create your models here. 10 | 11 | class AccountManger(BaseUserManager): 12 | def _create_user(self,email,password,**extra_fields): 13 | if not email: 14 | raise ValueError('Your have not provided a valid e-mail address') 15 | 16 | email=self.normalize_email(email) 17 | user=self.model(email=email,**extra_fields) 18 | user.set_password(password) 19 | user.save(using=self._db) 20 | return user 21 | 22 | 23 | def create_user(self, email=None, password=None, **extra_fields): 24 | 25 | return self._create_user(email, password, **extra_fields) 26 | 27 | 28 | def create_superuser(self, email, password, **extra_fields): 29 | extra_fields.setdefault('is_staff', True) 30 | extra_fields.setdefault('is_superuser', True) 31 | extra_fields.setdefault('is_admin',True) 32 | 33 | if extra_fields.get('is_staff') is not True: 34 | raise ValueError('Superuser must have is_staff=True.') 35 | if extra_fields.get('is_superuser') is not True: 36 | raise ValueError('Superuser must have is_superuser=True.') 37 | if extra_fields.get('is_admin') is not True: 38 | raise ValueError('Superuser must have is_admin=True.') 39 | 40 | return self._create_user(email, password, **extra_fields) 41 | 42 | 43 | class Category(models.Model): 44 | Category_name=models.CharField(max_length=250,blank=True,null=True) 45 | class Meta: 46 | verbose_name = 'category' 47 | 48 | def __str__(self): 49 | return self.Category_name 50 | 51 | 52 | class Occupation(models.Model): 53 | Cat = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True) 54 | titile=models.CharField(max_length=250,blank=True,null=True) 55 | 56 | class Meta: 57 | verbose_name = 'Occupation' 58 | 59 | 60 | def __str__(self): 61 | return self.titile 62 | 63 | class User(AbstractBaseUser): 64 | first_name=models.CharField(max_length=50,blank=True ) 65 | last_name=models.CharField(max_length=50,blank=True) 66 | username=models.CharField(max_length=50,blank=True) 67 | email=models.EmailField(max_length=100,unique=True,blank=True) 68 | phone_number=models.CharField(max_length=50,blank=True) 69 | pic=models.ImageField(upload_to="pro_pic/",null=True,blank=True) 70 | cover=models.ImageField(upload_to="cover/",null=True,blank=True) 71 | Occup=models.ForeignKey(Occupation,on_delete=models.CASCADE, blank=True , null=True) 72 | cat=models.ForeignKey(Category,on_delete=models.CASCADE,blank=True,null=True) 73 | is_setup_complete = models.BooleanField(default=False) 74 | 75 | 76 | #required 77 | 78 | 79 | date_joined=models.DateTimeField(auto_now_add=True) 80 | last_login=models.DateTimeField(auto_now_add=True) 81 | is_admin=models.BooleanField(default=False) 82 | is_staff=models.BooleanField(default=False) 83 | is_active=models.BooleanField(default=False) 84 | is_superuser=models.BooleanField(default=False) 85 | is_available=models.BooleanField(default=False) 86 | 87 | 88 | USERNAME_FIELD='email' 89 | REQUIRED_FIELDS=['username','first_name','last_name','phone_number'] 90 | 91 | 92 | objects=AccountManger() 93 | 94 | 95 | def __str__(self): 96 | return self.email 97 | 98 | def has_perm(self,pars,obj=None): 99 | return self.is_superuser 100 | 101 | def has_module_perms(self,add_label): 102 | return True 103 | def get_last_login_day(self): 104 | return self.last_login.date() 105 | 106 | def get_last_login_time(self): 107 | return self.last_login.time() 108 | 109 | def is_user_online(self): 110 | now = datetime.now() 111 | last_active_threshold = now - timedelta(minutes=5) 112 | return self.is_active and self.last_login >= last_active_threshold 113 | 114 | 115 | 116 | class Address(models.Model): 117 | user=models.ForeignKey(User,on_delete=models.CASCADE,blank=True) 118 | house_name=models.CharField(max_length=250,unique=False,blank=True) 119 | landmark=models.CharField(max_length=100,blank=True) 120 | pincode=models.IntegerField(blank=True) 121 | city=models.CharField(max_length=200,unique=False,blank=True) 122 | district=models.CharField(max_length=100,unique=False,blank=True) 123 | state=models.CharField(max_length=200,unique=False,blank=True) 124 | country=models.CharField(max_length=150,unique=False,blank=True) 125 | default=models.BooleanField(default=False,blank=True) 126 | 127 | def __str__(self): 128 | return self.user.username 129 | 130 | 131 | 132 | @receiver(post_save, sender=User) 133 | def user_blocking_notification(sender, instance, **kwargs): 134 | print(kwargs,'kkwasgs>>>>>>>>>>>>>>>>') 135 | 136 | 137 | 138 | if instance.is_active: 139 | subject = "You've been unblocked" 140 | message = f"Dear {instance.username},\n\nYour account has been unblocked by the admin." 141 | else: 142 | subject = "You've been blocked" 143 | message = f"Dear {instance.username},\n\nYour account has been blocked by the admin." 144 | 145 | send_mail( 146 | subject, 147 | message, 148 | settings.EMAIL_HOST_USER, 149 | [instance.email], 150 | fail_silently=False, 151 | ) 152 | 153 | 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /Home/views2.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from rest_framework.views import APIView 3 | from rest_framework.generics import UpdateAPIView,CreateAPIView,DestroyAPIView 4 | from .models import * 5 | from .serializer import * 6 | from rest_framework.response import Response 7 | from rest_framework import status 8 | from rest_framework.decorators import api_view 9 | from rest_framework import generics 10 | from Account.serilizer import * 11 | from django.db.models import Q 12 | from django.contrib.auth import get_user_model 13 | from Account.permision import IsAuthenticatedWithToken 14 | from rest_framework.pagination import PageNumberPagination 15 | User = get_user_model() 16 | 17 | class UserByCategoryView(APIView): 18 | permission_classes = [IsAuthenticatedWithToken] 19 | 20 | 21 | def get(self, request, categoryName): 22 | try: 23 | users = User.objects.filter(Occup__Cat__Category_name=categoryName) 24 | 25 | serializer = UserSerializer(users, many=True) 26 | return Response(serializer.data) 27 | except Exception as e: 28 | return Response({"message": f"Error fetching users by category. {e}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) 29 | 30 | 31 | 32 | 33 | 34 | class SearchUsersByCategory(APIView): 35 | def get(self, request, categoryName): 36 | try: 37 | search_query = request.query_params.get('q', '') 38 | users = User.objects.filter( 39 | Q(Occup__Cat__Category_name=categoryName) & 40 | (Q(Occup__titile__icontains=search_query) | 41 | Q(username__icontains=search_query) | 42 | Q(first_name__icontains=search_query)) 43 | ) 44 | 45 | serializer = UserSerializer(users, many=True) 46 | return Response(serializer.data) 47 | except Exception as e: 48 | return Response({"message": f"Error searching users by category and occupation. {e}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) 49 | 50 | 51 | 52 | class AutoSuggestUsers(APIView): 53 | def get(self, request, categoryName): 54 | try: 55 | search_query = request.query_params.get('q', '') 56 | suggestions = User.objects.filter( 57 | Q(Occup__Cat__Category_name=categoryName) & 58 | Q(Occup__titile__icontains=search_query) | 59 | Q(username__icontains=search_query) | 60 | Q(first_name__icontains=search_query) 61 | ).values('id', 'username', 'first_name', 'last_name','Occup__titile') 62 | return Response(suggestions) 63 | except Exception as e: 64 | return Response({"message": f"Error fetching auto-suggestions. {e}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) 65 | 66 | 67 | # class ProfileView(APIView): 68 | # def get(self, request, username): 69 | # try: 70 | # user = User.objects.get(username=username) 71 | # serializer = getProfileSerializer(user) 72 | # return Response({'user': serializer.data}, status=status.HTTP_200_OK) 73 | # except User.DoesNotExist: 74 | # return Response({'error': 'User not found'}, status=status.HTTP_404_NOT_FOUND) 75 | 76 | 77 | class GetUserinfo(APIView): 78 | 79 | def get(self, request, username): 80 | user = User.objects.get(username=username) 81 | user_address = Address.objects.get(user=user) 82 | 83 | print('idjkdlfk',user.Occup) 84 | ocup_instance=Occupation.objects.get(id=user.Occup.id) 85 | print('Occup_instance',ocup_instance) 86 | category=ocup_instance.Cat.Category_name 87 | print('ffafalflafla',category) 88 | 89 | 90 | 91 | serializer = UserSerializer(user) 92 | occup_serializer = OccupationSerilizer(ocup_instance) 93 | user_serializer = AccountSerilizer(user_address) 94 | 95 | response_data = { 96 | 'user': serializer.data, 97 | 'user_address': user_serializer.data, 98 | 'user_occupation': occup_serializer.data, 99 | 'category': category, 100 | 101 | } 102 | return Response(response_data) 103 | 104 | 105 | 106 | # class AllReviewsListView(APIView): 107 | # def get(self, request): 108 | # reviews = Review.objects.all() 109 | # serializer = ReviewSerializer(reviews, many=True) 110 | # return Response(serializer.data, status=status.HTTP_200_OK) 111 | 112 | 113 | 114 | class User1ReviewsListView(APIView): 115 | def get(self, request, user1_id): 116 | reviews = Review.objects.filter(user1=user1_id) 117 | serializer = ReviewSerializer(reviews, many=True) 118 | return Response(serializer.data, status=status.HTTP_200_OK) 119 | 120 | class User1Reviews(APIView): 121 | def get(self, request, username): 122 | reviews = Review.objects.filter(user1__username=username) 123 | serializer = ReviewSerializer(reviews, many=True) 124 | return Response(serializer.data, status=status.HTTP_200_OK) 125 | 126 | 127 | class User1CreateReviews(CreateAPIView): 128 | serializer_class = CreateReviewSerializer 129 | 130 | def perform_create(self, serializer): 131 | username=self.request.data.get('username') 132 | user=User.objects.get(username=username) 133 | serializer.save(user1=user) 134 | return super().perform_create(serializer) 135 | 136 | 137 | 138 | # class ReviewDeleteView(APIView): 139 | # def delete(self, request, review_id): 140 | # try: 141 | # review = Review.objects.get(pk=review_id) 142 | # except Review.DoesNotExist: 143 | # return Response({"error": "Review not found."}, status=status.HTTP_404_NOT_FOUND) 144 | # review.delete() 145 | # return Response(status=status.HTTP_204_NO_CONTENT) 146 | 147 | 148 | class ReviewDeleteView(DestroyAPIView): 149 | serializer_class=ReviewSerializer 150 | queryset = Review.objects.all() 151 | lookup_field='id' 152 | 153 | -------------------------------------------------------------------------------- /Post/views.py: -------------------------------------------------------------------------------- 1 | from django.db.models import Count 2 | from django.shortcuts import render 3 | from rest_framework.views import APIView 4 | from rest_framework.generics import UpdateAPIView,ListAPIView,CreateAPIView,DestroyAPIView,ListCreateAPIView 5 | from .models import * 6 | from .serializer import * 7 | from rest_framework.response import Response 8 | from rest_framework import status 9 | from rest_framework.decorators import api_view 10 | from rest_framework import generics 11 | from Account.permision import IsAuthenticatedWithToken 12 | from rest_framework.permissions import IsAuthenticated 13 | from rest_framework import viewsets 14 | 15 | # Create your views here. 16 | 17 | 18 | 19 | # class PostListCreateView(generics.ListCreateAPIView): 20 | # queryset = Post.objects.all() 21 | # print(queryset,'fkjjfojsofjof') 22 | # serializer_class = PostSerializer 23 | 24 | # class PostList(ListAPIView): 25 | # serializer_class = PostSerializer 26 | 27 | # def get_queryset(self): 28 | # return Post.objects.select_related('user').all().order_by('-date') 29 | 30 | 31 | class PostList(APIView): 32 | def get(self, request,user_id): 33 | posts = Post.objects.all().order_by('-date') 34 | serializer = PostSerializer(posts, many=True,context={'user_id': user_id}) 35 | return Response(serializer.data, status=200) 36 | 37 | 38 | 39 | class PostListAdmin(APIView): 40 | def get(self, request,user_id): 41 | posts = Post.objects.all().order_by('-date') 42 | serializer = PostSerializer(posts, many=True,context={'user_id': user_id}) 43 | return Response(serializer.data, status=200) 44 | 45 | 46 | 47 | class PostListCreateAPIView(ListCreateAPIView): 48 | serializer_class = PostSerializer 49 | 50 | def get_queryset(self): 51 | user_id = self.kwargs.get("user") 52 | print() 53 | print('start') 54 | print(self.kwargs,'kwargs>>>>>>>>>') 55 | 56 | return Post.objects.all().order_by('-date') 57 | 58 | 59 | 60 | 61 | class AddPostView(CreateAPIView): 62 | queryset = Post.objects.all() 63 | serializer_class = AddPostSerializer 64 | 65 | 66 | 67 | class DeletePostView(DestroyAPIView): 68 | queryset = Post.objects.all() 69 | serializer_class = AddPostSerializer 70 | lookup_field='id' 71 | 72 | 73 | 74 | class UserCommentsView(APIView): 75 | def get(self, request, post_id): 76 | try: 77 | post = Post.objects.get(id=post_id) 78 | print(post_id,'fjajfdld') 79 | except Post.DoesNotExist: 80 | return Response({"error": "Post not found"}, status=status.HTTP_404_NOT_FOUND) 81 | 82 | user_comments = Comments.objects.filter(post=post, user=request.user) 83 | serializer = CommentSerializer(user_comments, many=True) 84 | return Response(serializer.data, status=status.HTTP_200_OK) 85 | 86 | 87 | class PostCommentsView(APIView): 88 | def get(self, request, post_id): 89 | try: 90 | post = Post.objects.get(id=post_id) 91 | except Post.DoesNotExist: 92 | return Response({"error": "Post not found"}, status=status.HTTP_404_NOT_FOUND) 93 | 94 | comments = Comments.objects.filter(post=post) 95 | serializer = CommentSerializer(comments, many=True) 96 | return Response(serializer.data, status=status.HTTP_200_OK) 97 | 98 | class AddCommentView(generics.CreateAPIView): 99 | queryset=Comments.objects.all() 100 | serializer_class = CommentSerializer 101 | 102 | 103 | class UserPostList(ListAPIView): 104 | serializer_class = PostSerializer 105 | 106 | def get_serializer_context(self): 107 | context = super().get_serializer_context() 108 | context['user_id'] = self.kwargs['user_id'] 109 | return context 110 | 111 | def get_queryset(self): 112 | user_id = self.kwargs['user_id'] 113 | return Post.objects.filter(user_id=user_id).order_by('-date') 114 | 115 | 116 | 117 | class UserPost(ListAPIView): 118 | serializer_class = PostUserSerializer 119 | 120 | def get_serializer_context(self): 121 | context = super().get_serializer_context() 122 | context['username'] = self.kwargs['username'] 123 | return context 124 | 125 | def get_queryset(self): 126 | username = self.kwargs['username'] 127 | return Post.objects.filter(user__username=username).order_by('-date') 128 | 129 | 130 | 131 | 132 | class DeletePost(APIView): 133 | def delete(self, request, post_id): 134 | try: 135 | post = Post.objects.get(id=post_id) 136 | if post.user_id == request.user.id: 137 | post.delete() 138 | return Response(status=status.HTTP_204_NO_CONTENT) 139 | else: 140 | return Response({"error": "You are not authorized to delete this post."}, status=status.HTTP_403_FORBIDDEN) 141 | except Post.DoesNotExist: 142 | return Response({"error": "Post not found."}, status=status.HTTP_404_NOT_FOUND) 143 | 144 | 145 | 146 | class CommentDeleteView(DestroyAPIView): 147 | queryset = Comments.objects.all() 148 | serializer_class = CommentSerializer 149 | lookup_field='id' 150 | 151 | 152 | # @api_view(['POST']) 153 | # def un_like_post(request): 154 | # user_id = request.data.get('user') 155 | # post_id = request.data.get('post') 156 | # is_post_exist = Like.objects.filter(post__id=post_id,user__id=user_id).exists() 157 | # if is_post_exist: 158 | # post_like_instance = Like.objects.get(post__id=post_id,user__id=user_id) 159 | # post_like_instance.delete() 160 | # return Response(status=204) 161 | # else: 162 | # return Response(status=404, data={"message": "given post not found"}) 163 | 164 | 165 | 166 | @api_view(['DELETE']) 167 | def un_like_post(request, post_id, user_id): 168 | try: 169 | post_like_instance = Like.objects.get(post__id=post_id, user__id=user_id) 170 | post_like_instance.delete() 171 | return Response(status=204) 172 | except Like.DoesNotExist: 173 | return Response(status=404) 174 | 175 | class PostLikeView(ListCreateAPIView): 176 | serializer_class = LikeSerializer 177 | def get_queryset(self): 178 | 179 | user_id=self.kwargs.get("user_id") 180 | post_id = self.kwargs.get("post_id") 181 | 182 | return Like.objects.filter(post__id=post_id,user__id=user_id) -------------------------------------------------------------------------------- /Home/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from rest_framework.views import APIView 3 | from rest_framework.generics import UpdateAPIView 4 | from .models import * 5 | from .serializer import * 6 | from rest_framework.response import Response 7 | from rest_framework import status 8 | from rest_framework.decorators import api_view 9 | from rest_framework import generics 10 | # Create your views here. 11 | 12 | class getBannerLIst(APIView): 13 | def get(self,request): 14 | banner=Banner.objects.filter(is_list=True) 15 | serializer=BannerListSerializer(banner,many=True) 16 | return Response(serializer.data) 17 | 18 | 19 | class getAdminBannerLIst(APIView): 20 | def get(self,request): 21 | banner=Banner.objects.all() 22 | serializer=BannerListSerializer(banner,many=True) 23 | return Response(serializer.data) 24 | 25 | class BannerCreateView(APIView): 26 | def post(self, request): 27 | serializer = BannerListSerializer(data=request.data) 28 | if serializer.is_valid(): 29 | serializer.save() 30 | return Response(serializer.data, status=status.HTTP_201_CREATED) 31 | return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 32 | 33 | 34 | 35 | class ListUnlistBanner(APIView): 36 | def patch(self, request, pk): 37 | try: 38 | banner = Banner.objects.get(id=pk) 39 | except Banner.DoesNotExist: 40 | return Response({"error": "Quote not found"}, status=status.HTTP_404_NOT_FOUND) 41 | 42 | is_list = request.data.get("is_list", None) 43 | if is_list is None: 44 | return Response({"error": "is_list parameter not provided"}, status=status.HTTP_400_BAD_REQUEST) 45 | 46 | if not isinstance(is_list, bool): 47 | return Response({"error": "is_list parameter should be a boolean value"}, status=status.HTTP_400_BAD_REQUEST) 48 | 49 | banner.is_list = is_list 50 | banner.save() 51 | 52 | serializer = QuoteListSerializer(banner) 53 | return Response(serializer.data) 54 | 55 | 56 | 57 | class BannerEditView(generics.RetrieveUpdateDestroyAPIView): 58 | queryset=Banner.objects.all() 59 | serializer_class=BannerListSerializer 60 | 61 | @api_view(['DELETE']) 62 | def bannerDelete(request, pk): 63 | banner = Banner.objects.get(id=pk) 64 | banner.delete() 65 | return Response('User deleted') 66 | 67 | 68 | class getQuoteLIst(APIView): 69 | def get(self,request): 70 | quote=Quote.objects.filter(is_list=True) 71 | serializer=QuoteListSerializer(quote,many=True) 72 | return Response(serializer.data) 73 | 74 | 75 | class getAdminquote(APIView): 76 | def get(self,request): 77 | quote=Quote.objects.all() 78 | serializer=QuoteListSerializer(quote,many=True) 79 | return Response(serializer.data) 80 | 81 | 82 | 83 | class QuoteCreateView(APIView): 84 | def post(self,request): 85 | serializer=QuoteListSerializer(data=request.data) 86 | if serializer.is_valid(): 87 | serializer.save() 88 | return Response(serializer.data, status=status.HTTP_201_CREATED) 89 | return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 90 | 91 | 92 | 93 | 94 | class QuoteUpdate(APIView): 95 | 96 | def get(self,request,pk): 97 | try: 98 | quote = Quote.objects.get(id=pk) 99 | except Quote.DoesNotExist: 100 | return Response({"error": "Quote not found"}, status=status.HTTP_404_NOT_FOUND) 101 | 102 | serializer = QuoteListSerializer(quote, data=request.data) 103 | if serializer.is_valid(): 104 | serializer.save() 105 | return Response(serializer.data) 106 | return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 107 | 108 | 109 | 110 | def put(self, request, pk): 111 | try: 112 | quote = Quote.objects.get(id=pk) 113 | except Quote.DoesNotExist: 114 | return Response({"error": "Quote not found"}, status=status.HTTP_404_NOT_FOUND) 115 | 116 | serializer = QuoteListSerializer(quote, data=request.data) 117 | if serializer.is_valid(): 118 | serializer.save() 119 | return Response(serializer.data) 120 | return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 121 | 122 | 123 | 124 | class ListUnlist(APIView): 125 | def patch(self, request, pk): 126 | try: 127 | quote = Quote.objects.get(id=pk) 128 | except Quote.DoesNotExist: 129 | return Response({"error": "Quote not found"}, status=status.HTTP_404_NOT_FOUND) 130 | 131 | is_list = request.data.get("is_list", None) 132 | if is_list is None: 133 | return Response({"error": "is_list parameter not provided"}, status=status.HTTP_400_BAD_REQUEST) 134 | 135 | if not isinstance(is_list, bool): 136 | return Response({"error": "is_list parameter should be a boolean value"}, status=status.HTTP_400_BAD_REQUEST) 137 | 138 | quote.is_list = is_list 139 | quote.save() 140 | 141 | serializer = QuoteListSerializer(quote) 142 | return Response(serializer.data) 143 | 144 | 145 | 146 | @api_view(['DELETE']) 147 | def quoteDelete(request, pk): 148 | banner = Quote.objects.get(id=pk) 149 | banner.delete() 150 | return Response('User deleted') 151 | 152 | 153 | class getMemberLIst(APIView): 154 | def get(self,request): 155 | member=Member.objects.filter(is_list=True) 156 | serializer=MemberListSerializer(member,many=True) 157 | return Response(serializer.data) 158 | 159 | 160 | 161 | 162 | class getAdminMember(APIView): 163 | def get(self,request): 164 | member=Member.objects.all() 165 | serializer=MemberListSerializer(member,many=True) 166 | return Response(serializer.data) 167 | 168 | 169 | @api_view(['DELETE']) 170 | def memberDelete(request, pk): 171 | banner = Member.objects.get(id=pk) 172 | banner.delete() 173 | return Response('User deleted') 174 | 175 | 176 | class MemberCreateView(APIView): 177 | def post(self,request): 178 | serializer=MemberListSerializer(data=request.data) 179 | if serializer.is_valid(): 180 | serializer.save() 181 | return Response(serializer.data, status=status.HTTP_201_CREATED) 182 | return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 183 | 184 | class ListUnlistMember(APIView): 185 | def patch(self, request, pk): 186 | try: 187 | member = Member.objects.get(id=pk) 188 | except Member.DoesNotExist: 189 | return Response({"error": "Quote not found"}, status=status.HTTP_404_NOT_FOUND) 190 | 191 | is_list = request.data.get("is_list", None) 192 | if is_list is None: 193 | return Response({"error": "is_list parameter not provided"}, status=status.HTTP_400_BAD_REQUEST) 194 | 195 | if not isinstance(is_list, bool): 196 | return Response({"error": "is_list parameter should be a boolean value"}, status=status.HTTP_400_BAD_REQUEST) 197 | 198 | member.is_list = is_list 199 | member.save() 200 | 201 | 202 | # if not is_list and member.category: 203 | # from django.contrib.auth import get_user_model 204 | # User = get_user_model() 205 | # associated_users = User.objects.filter(cat=member.category, is_active=True) 206 | # for user in associated_users: 207 | # user.is_active = False 208 | # user.save() 209 | serializer = QuoteListSerializer(member) 210 | return Response(serializer.data) 211 | 212 | 213 | class MemberEditView(generics.RetrieveUpdateDestroyAPIView): 214 | queryset=Member.objects.all() 215 | serializer_class=MemberListSerializer 216 | print(serializer_class,'admin member edit ') -------------------------------------------------------------------------------- /Backend/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for Backend project. 3 | 4 | Generated by 'django-admin startproject' using Django 4.2.3. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/4.2/ref/settings/ 11 | """ 12 | import os 13 | from pathlib import Path 14 | from datetime import timedelta 15 | 16 | from decouple import config 17 | 18 | 19 | 20 | 21 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 22 | BASE_DIR = Path(__file__).resolve().parent.parent 23 | 24 | 25 | # Quick-start development settings - unsuitable for production 26 | # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ 27 | 28 | # SECURITY WARNING: keep the secret key used in production secret! 29 | SECRET_KEY =config('secret_key') 30 | 31 | # SECURITY WARNING: don't run with debug turned on in production! 32 | DEBUG = True 33 | 34 | ALLOWED_HOSTS = ["*"] 35 | 36 | 37 | 38 | 39 | # Application definition 40 | 41 | INSTALLED_APPS = [ 42 | "daphne", 43 | 'django.contrib.admin', 44 | 'django.contrib.auth', 45 | 'django.contrib.contenttypes', 46 | 'django.contrib.sessions', 47 | 'django.contrib.messages', 48 | 'django.contrib.staticfiles', 49 | 'cloudinary_storage', 50 | 'cloudinary', 51 | 'Account', 52 | 'rest_framework', 53 | 'corsheaders', 54 | 'rest_framework_simplejwt.token_blacklist', 55 | 'Home', 56 | 'Post', 57 | 'Message', 58 | 59 | ] 60 | 61 | 62 | REST_FRAMEWORK = { 63 | 'DEFAULT_RENDERER_CLASSES': [ 64 | 'rest_framework.renderers.JSONRenderer', 65 | 'rest_framework.renderers.BrowsableAPIRenderer', 66 | 67 | ], 68 | 'DEFAULT_FILTER_BACKENDS':[ 69 | 70 | 'rest_framework.filters.SearchFilter', 71 | ], 72 | # 'DEFAULT_AUTHENTICATION_CLASSES': ( 73 | 74 | # 'rest_framework_simplejwt.authentication.JWTAuthentication', 75 | # ) 76 | 77 | } 78 | 79 | 80 | SIMPLE_JWT = { 81 | "ACCESS_TOKEN_LIFETIME": timedelta(minutes=5), 82 | "REFRESH_TOKEN_LIFETIME": timedelta(days=90), 83 | "ROTATE_REFRESH_TOKENS": True, 84 | "BLACKLIST_AFTER_ROTATION": True, 85 | "UPDATE_LAST_LOGIN": False, 86 | 87 | "ALGORITHM": "HS256", 88 | "VERIFYING_KEY": "", 89 | "AUDIENCE": None, 90 | "ISSUER": None, 91 | "JSON_ENCODER": None, 92 | "JWK_URL": None, 93 | "LEEWAY": 0, 94 | 95 | "AUTH_HEADER_TYPES": ("Bearer",), 96 | "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION", 97 | "USER_ID_FIELD": "id", 98 | "USER_ID_CLAIM": "user_id", 99 | "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule", 100 | 101 | "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",), 102 | "TOKEN_TYPE_CLAIM": "token_type", 103 | "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser", 104 | 105 | "JTI_CLAIM": "jti", 106 | 107 | "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp", 108 | "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5), 109 | "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1), 110 | 111 | "TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer", 112 | "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer", 113 | "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer", 114 | "TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer", 115 | "SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer", 116 | "SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer", 117 | } 118 | 119 | 120 | 121 | CHANNEL_LAYERS = { 122 | "default": { 123 | "BACKEND": "channels_redis.core.RedisChannelLayer", 124 | "CONFIG": { 125 | "hosts": [(config('redis'))], 126 | }, 127 | }, 128 | } 129 | 130 | MIDDLEWARE = [ 131 | 132 | 133 | 'django.middleware.security.SecurityMiddleware', 134 | "corsheaders.middleware.CorsMiddleware", 135 | 'django.contrib.sessions.middleware.SessionMiddleware', 136 | 'django.middleware.common.CommonMiddleware', 137 | 'django.middleware.csrf.CsrfViewMiddleware', 138 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 139 | 'django.contrib.messages.middleware.MessageMiddleware', 140 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 141 | ] 142 | 143 | ROOT_URLCONF = 'Backend.urls' 144 | 145 | TEMPLATES = [ 146 | { 147 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 148 | 'DIRS': ['templates'], 149 | 'APP_DIRS': True, 150 | 'OPTIONS': { 151 | 'context_processors': [ 152 | 'django.template.context_processors.debug', 153 | 'django.template.context_processors.request', 154 | 'django.contrib.auth.context_processors.auth', 155 | 'django.contrib.messages.context_processors.messages', 156 | ], 157 | }, 158 | }, 159 | ] 160 | 161 | ASGI_APPLICATION = 'Backend.asgi.application' 162 | 163 | 164 | # Database 165 | # https://docs.djangoproject.com/en/4.2/ref/settings/#databases 166 | 167 | # DATABASES = { 168 | # 'default': { 169 | # 'ENGINE': 'django.db.backends.postgresql', 170 | # 'NAME':config('name'), 171 | # 'USER': config('user'), 172 | # 'PASSWORD':config('password'), 173 | # 'HOST':config('host'), 174 | # 'PORT':config('port'), 175 | # } 176 | # } 177 | 178 | DATABASES = { 179 | 'default': { 180 | 'ENGINE': 'django.db.backends.sqlite3', 181 | 'NAME': BASE_DIR / "db.sqlite3", 182 | } 183 | } 184 | 185 | 186 | 187 | # Password validation 188 | # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators 189 | 190 | AUTH_PASSWORD_VALIDATORS = [ 191 | { 192 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 193 | }, 194 | { 195 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 196 | }, 197 | { 198 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 199 | }, 200 | { 201 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 202 | }, 203 | ] 204 | 205 | 206 | # Internationalization 207 | # https://docs.djangoproject.com/en/4.2/topics/i18n/ 208 | 209 | LANGUAGE_CODE = 'en-us' 210 | 211 | TIME_ZONE = 'UTC' 212 | 213 | USE_I18N = True 214 | 215 | USE_TZ = True 216 | 217 | 218 | # Static files (CSS, JavaScript, Images) 219 | # https://docs.djangoproject.com/en/4.2/howto/static-files/ 220 | 221 | STATIC_URL = 'static/' 222 | 223 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 224 | MEDIA_URL = '/media/' 225 | DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage' 226 | 227 | AUTH_USER_MODEL='Account.User' 228 | 229 | # Default primary key field type 230 | # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field 231 | 232 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 233 | 234 | EMAIL_HOST='smtp.gmail.com' 235 | EMAIL_PORT= 587 236 | EMAIL_HOST_USER=config('EMAIL_USER') 237 | EMAIL_HOST_PASSWORD=config('EMAIL_PASSWORD') 238 | EMAIL_USE_TLS=True 239 | 240 | CORS_ALLOWED_ORIGINS = [ 241 | "http://localhost:3000", 242 | "http://127.0.0.1:3000", 243 | "http://127.0.0.1:3001", 244 | "http://localhost:8000", 245 | "http://127.0.0.1:8000", 246 | 'https://farmcommunity.vercel.app', 247 | 'https://farmunity-backend.onrender.com' 248 | ] 249 | 250 | CORS_ORIGIN_ALLOW_ALL=True 251 | 252 | 253 | # CELERY_BROKER_URL='redis://127.0.0.1:6379' 254 | # CELERY_RESULT_BACKEND='redis://127.0.0.1:6379' 255 | # CELERY_ACCEPT_CONTENT=['application/json'] 256 | # CELERY_RESULT_SERIALIZER='json' 257 | # CELERY_TASK_SERIALIZER='json' 258 | 259 | # CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True 260 | 261 | CLOUDINARY_STORAGE = { 262 | 'CLOUD_NAME': config('cloud_name'), 263 | 'API_KEY': config('api_key'), 264 | 'API_SECRET':config('api_secret'), 265 | } 266 | 267 | 268 | API_KEY = config('API_KEY') -------------------------------------------------------------------------------- /Account/views.py: -------------------------------------------------------------------------------- 1 | # from celery import shared_task 2 | from django.shortcuts import render 3 | from django.shortcuts import get_object_or_404 4 | from django.urls import reverse 5 | from django.contrib.sites.shortcuts import get_current_site 6 | from django.template.loader import render_to_string 7 | from django.utils.http import urlsafe_base64_decode,urlsafe_base64_encode 8 | from django.utils.encoding import force_bytes 9 | from django.contrib.auth.tokens import default_token_generator 10 | from django.core.mail import EmailMessage 11 | from django.http import HttpResponseRedirect 12 | from rest_framework import status 13 | from .tocken import create_jwt_pair_tokens 14 | from django.contrib.auth.mixins import LoginRequiredMixin 15 | from django.shortcuts import redirect 16 | from rest_framework.views import APIView 17 | from rest_framework.response import Response 18 | from rest_framework import status 19 | from .serilizer import UserProfileSerializer, AccountSerilizer,OccupationSerilizer,CategorySerilizer,UserSerializer 20 | from .models import User, Address, Category, Occupation 21 | # from celery.utils.log import get_task_logger 22 | # from datetime import datetime, timedelta 23 | 24 | 25 | from .models import * 26 | 27 | from rest_framework import serializers 28 | from rest_framework.views import APIView 29 | from rest_framework.generics import ListCreateAPIView,UpdateAPIView,RetrieveUpdateAPIView 30 | from rest_framework.response import Response 31 | from .serilizer import * 32 | from rest_framework.decorators import api_view,permission_classes 33 | from rest_framework.permissions import IsAuthenticated 34 | from rest_framework.generics import ListAPIView 35 | from rest_framework_simplejwt.serializers import TokenObtainPairSerializer 36 | from rest_framework_simplejwt.views import TokenObtainPairView 37 | from rest_framework.filters import SearchFilter 38 | from .permision import IsAuthenticatedWithToken 39 | 40 | 41 | 42 | 43 | from django.contrib.auth import authenticate 44 | 45 | # Create your views here. 46 | 47 | 48 | 49 | 50 | # 51 | 52 | @api_view(['GET']) 53 | def getRoutes(request): 54 | routes = [ 55 | '/token', 56 | '/token/refresh' 57 | ] 58 | return Response(routes) 59 | 60 | 61 | # user registration and sending activate email 62 | 63 | 64 | class RegisterView(APIView): 65 | def post(self,request): 66 | email=request.data.get('email') 67 | print(request.data) 68 | 69 | serializer=UserRegister(data=request.data) 70 | 71 | 72 | if serializer.is_valid(raise_exception=True): 73 | 74 | user= serializer.save() 75 | 76 | 77 | current_site = get_current_site(request) 78 | uid = urlsafe_base64_encode(force_bytes(user.pk)) 79 | token = default_token_generator.make_token(user) 80 | mail_subject = 'Please activate your account' 81 | 82 | message= render_to_string('account_verify_email.html', { 83 | 'user': user, 84 | 'domain': current_site, 85 | 'uid': urlsafe_base64_encode(force_bytes(user.pk)), 86 | 'token': default_token_generator.make_token(user), 87 | 'usename': urlsafe_base64_encode(force_bytes(user.username)) 88 | }) 89 | to_email = email 90 | send_email = EmailMessage(mail_subject, message, to=[to_email]) 91 | send_email.send() 92 | return Response({'msg':'Registration Success'}) 93 | 94 | return Response({'msg':'Registration Failed'}) 95 | 96 | 97 | 98 | # @shared_task 99 | # def send_registration_email(request,email): 100 | # print(request,'rerquetllnnln>>>>>>>.') 101 | # user = User.objects.get(email=email) 102 | # current_site = get_current_site(request) 103 | # mail_subject = 'Please activate your account' 104 | 105 | # message = render_to_string('account_verify_email.html', { 106 | # 'user': user, 107 | # 'domain': current_site, 108 | # 'uid': urlsafe_base64_encode(force_bytes(user.pk)), 109 | # 'token': default_token_generator.make_token(user), 110 | # 'username': urlsafe_base64_encode(force_bytes(user.username)) 111 | # }) 112 | # to_email = email 113 | # send_email = EmailMessage(mail_subject, message, to=[to_email]) 114 | # send_email.send() 115 | 116 | 117 | 118 | 119 | 120 | # class RegisterView(APIView): 121 | # def post(self, request): 122 | # email = request.data.get('email') 123 | # serializer = UserRegister(data=request.data) 124 | 125 | # if serializer.is_valid(raise_exception=True): 126 | # user = serializer.save() 127 | # print(user,'user') 128 | 129 | 130 | # send_registration_email.delay(request,email) 131 | 132 | # return Response({'msg': 'Registration Success'}) 133 | 134 | # return Response({'msg': 'Registration Failed'}) 135 | 136 | 137 | #for activating user and directing to login page 138 | 139 | 140 | @api_view(['GET']) 141 | def Activate(request,uidb64,token): 142 | try: 143 | uid = urlsafe_base64_decode(uidb64).decode() 144 | user = User._default_manager.get(pk = uid) 145 | except(TypeError, ValueError, OverflowError, User.DoesNotExist): 146 | user = None 147 | 148 | if user is not None and default_token_generator.check_token(user, token): 149 | user.is_active = True 150 | user.save() 151 | print('saved') 152 | 153 | # delete_activation_link.apply_async(args=[user.id], countdown=60) 154 | 155 | return HttpResponseRedirect('https://farmcommunity.vercel.app/login') 156 | 157 | 158 | # @shared_task 159 | # def delete_activation_link(user_id): 160 | # try: 161 | # user = User.objects.get(pk=user_id) 162 | # token_validity_period = timedelta(minutes=1) 163 | # activation_time = user.date_joined 164 | # if datetime.now() - activation_time > token_validity_period: 165 | # return 166 | 167 | # user.is_active = False 168 | # user.save() 169 | # print('Activation link deleted successfully') 170 | # except User.DoesNotExist: 171 | # print('User not found') 172 | 173 | 174 | 175 | # customizing jwt token 176 | 177 | class MyTokenObtainPairSerializer(TokenObtainPairSerializer): 178 | @classmethod 179 | def get_token(cls, user): 180 | token = super().get_token(user) 181 | token['email'] = user.email 182 | token['username'] = user.username 183 | token['is_staff'] = user.is_staff 184 | token['is_admin'] = user.is_admin 185 | token['is_setup_complete'] = user. is_setup_complete 186 | return token 187 | 188 | 189 | 190 | 191 | 192 | # generate a token 193 | 194 | class MyTokenObtainPairView(TokenObtainPairView): 195 | serializer_class = MyTokenObtainPairSerializer 196 | 197 | 198 | 199 | 200 | # google login 201 | 202 | class GoogleAuthentication(APIView): 203 | def post(self, request): 204 | email = request.data.get('email') 205 | password = request.data.get('password') 206 | 207 | if not User.objects.filter(email=email).exists(): 208 | serializer = GoogleAuthSerializer(data=request.data) 209 | 210 | if serializer.is_valid(raise_exception=True): 211 | 212 | user = serializer.save() 213 | user.is_active = True 214 | user.set_password(password) 215 | user.save() 216 | # 217 | user = authenticate(request, email=email, password=password) 218 | if user is not None: 219 | tokens = create_jwt_pair_tokens(user) 220 | response = { 221 | 'msg': "Login successfull", 222 | 'token': tokens, 223 | 'status': 200, 224 | 'user': { 225 | 'user_id': user.id, 226 | 'email': user.email, 227 | 'is_active': user.is_active, 228 | 229 | }, 230 | } 231 | return Response(data=response, status=status.HTTP_200_OK) 232 | 233 | return Response(data={'msg': 'Login Failed','status':400 }) 234 | 235 | #for validating email and senting reseting mail to the user 236 | 237 | class ForgotPasswordView(APIView): 238 | def post(self, request:Response): 239 | print('Function Called') 240 | 241 | email = request.data['email'] 242 | print(email) 243 | if User.objects.filter(email=email).exists: 244 | user = User.objects.get(email=email) 245 | 246 | current_site=get_current_site(request) 247 | mail_subject = 'Reset your password' 248 | message=render_to_string('Reset_password_email.html',{ 249 | 'user':user, 250 | 'domain':current_site, 251 | 'uid':urlsafe_base64_encode(force_bytes(user.pk)), 252 | 'token':default_token_generator.make_token(user), 253 | }) 254 | to_email = email 255 | send_email = EmailMessage(mail_subject,message,to=[to_email]) 256 | send_email.send() 257 | return Response({'msg':'Please Reset Password In The Link', 'user_id':user.id}) 258 | else: 259 | return Response({"message": "Please Reset Password in the link"}, status=status.HTTP_400_BAD_REQUEST) 260 | 261 | #for check for the user and directing to password reseting page 262 | 263 | @api_view(['GET']) 264 | def ResetPassword_validate(request, uidb64, token): 265 | try: 266 | uid = urlsafe_base64_decode(uidb64).decode() 267 | user = User._default_manager.get(pk=uid) 268 | except(TypeError, ValueError, OverflowError, User.DoesNotExist): 269 | user = None 270 | if user is not None and default_token_generator.check_token(user,token): 271 | request.session['uid']=uid 272 | return HttpResponseRedirect('https://farmcommunity.vercel.app/reset-password') 273 | else: 274 | return Response({'message':'Forgot password mail sented Success'}) 275 | 276 | 277 | #for reseting the the password 278 | 279 | class ResetPasswordView(APIView): 280 | def post(self, request): 281 | str_user_id = request.data.get('user_id') 282 | password = request.data.get('password') 283 | 284 | if str_user_id is not None and password: 285 | try: 286 | user_id = int(str_user_id) 287 | user = User.objects.get(pk=user_id) 288 | user.set_password(password) 289 | user.save() 290 | return Response({'message': 'Password Updated successfully'}) 291 | except (ValueError, User.DoesNotExist): 292 | return Response({'message': 'Invalid user ID'}) 293 | else: 294 | 295 | 296 | return HttpResponseRedirect('https://farmcommunity.vercel.app/reset-password') 297 | 298 | 299 | class ListUserview(ListAPIView): 300 | serializer_class = UserSerializer 301 | def get_queryset(self): 302 | return User.objects.filter(is_admin=False, is_staff=False).order_by('-id') 303 | 304 | 305 | class AdminSearchUser(ListCreateAPIView): 306 | serializer_class = UserSerializer 307 | filter_backends = [SearchFilter] 308 | queryset = User.objects.filter(is_admin=False, is_staff=False) 309 | search_fields = ['username'] 310 | 311 | 312 | 313 | 314 | # for blocking a user 315 | 316 | class BlockUser(APIView): 317 | def patch(self,request,id): 318 | try: 319 | user=User.objects.get(id=id) 320 | print(user,'user') 321 | user.is_active=not user.is_active 322 | user.save() 323 | if user.is_active: 324 | message = 'User unblocked!' 325 | else: 326 | message = 'Blocked successfully' 327 | return Response({'msg': message}) 328 | except user.DoesNotExist: 329 | return Response({'msg':"User not found"}) 330 | except Exception as e: 331 | return Response({'msg':str(e)}) 332 | 333 | 334 | 335 | 336 | # get User Details 337 | 338 | 339 | class GetUserDetails(APIView): 340 | def get(self, request, user_id): 341 | user = User.objects.get(id=user_id) 342 | user_address = Address.objects.get(user=user) 343 | 344 | ocup_instance = None 345 | category = None 346 | 347 | if user.Occup: 348 | ocup_instance = Occupation.objects.get(id=user.Occup.id) 349 | category = ocup_instance.Cat.Category_name 350 | 351 | serializer = UserSerializer(user) 352 | occup_serializer = OccupationSerilizer(ocup_instance) if ocup_instance else None 353 | user_serializer = AccountSerilizer(user_address) 354 | 355 | response_data = { 356 | 'user': serializer.data, 357 | 'user_address': user_serializer.data, 358 | 'user_occupation': occup_serializer.data if occup_serializer else None, 359 | 'category': category, 360 | } 361 | return Response(response_data) 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | class GetsingleDetails(APIView): 372 | 373 | def get(self, request, user_id): 374 | user = User.objects.get(id=user_id) 375 | user_address = Address.objects.get(user=user) 376 | 377 | ocup_instance = None 378 | category = None 379 | 380 | if user.Occup: # Check if user has an associated occupation 381 | ocup_instance = Occupation.objects.get(id=user.Occup.id) 382 | category = ocup_instance.Cat.Category_name 383 | 384 | serializer = UserSerializer(user) 385 | occup_serializer = OccupationSerilizer(ocup_instance) if ocup_instance else None 386 | user_serializer = AccountSerilizer(user_address) 387 | 388 | response_data = { 389 | 'user': serializer.data, 390 | 'user_address': user_serializer.data, 391 | 'user_occupation': occup_serializer.data if occup_serializer else None, 392 | 'category': category, 393 | } 394 | return Response(response_data) 395 | 396 | 397 | # def get(self, request, user_id): 398 | # user = User.objects.get(id=user_id) 399 | # user_address = Address.objects.get(user=user) 400 | 401 | # print('idjkdlfk',user.Occup) 402 | # ocup_instance=Occupation.objects.get(id=user.Occup.id) 403 | # print('Occup_instance',ocup_instance) 404 | # category=ocup_instance.Cat.Category_name 405 | # print('ffafalflafla',category) 406 | 407 | 408 | 409 | # serializer = UserSerializer(user) 410 | # occup_serializer = OccupationSerilizer(ocup_instance) 411 | # user_serializer = AccountSerilizer(user_address) 412 | 413 | # response_data = { 414 | # 'user': serializer.data, 415 | # 'user_address': user_serializer.data, 416 | # 'user_occupation': occup_serializer.data, 417 | # 'category': category, 418 | 419 | # } 420 | # return Response(response_data) 421 | 422 | 423 | 424 | 425 | class userProfileSet1(UpdateAPIView): 426 | queryset=User.objects.all() 427 | serializer_class=UserProfileSerializer 428 | lookup_field='id' 429 | 430 | class userProfileSet2(ListCreateAPIView): 431 | 432 | queryset=Address.objects.all() 433 | serializer_class=AccountSerilizer 434 | 435 | 436 | @api_view(['POST']) 437 | def get_new_token(request): 438 | email= request.data.get('email') 439 | 440 | user = User.objects.get(email=email) 441 | token = create_jwt_pair_tokens(user) 442 | return Response(status=200,data={'token':token}) --------------------------------------------------------------------------------