├── .gitignore ├── LICENSE ├── README.md ├── authentication ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py ├── urls.py └── views.py ├── home ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ └── __init__.py ├── models.py ├── tasks.py ├── tests.py ├── urls.py └── views.py ├── manage.py ├── requirements.txt ├── softgo ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── static ├── authentication │ └── images │ │ ├── login_img.png │ │ └── register_img.png └── home │ ├── images │ └── dash-1.png │ ├── landing.css │ └── landing.js └── templates ├── authentication ├── login.html └── user_reg.html ├── home ├── dashboard.html ├── dashboard_main.html ├── landing │ ├── landing.html │ └── navbar.html ├── render_auto_clustering.html ├── render_explore_topics.html ├── render_search_papers.html └── tailwind.config.js └── partials └── message_popup.html /.gitignore: -------------------------------------------------------------------------------- 1 | db.sqlite3 2 | __pycache__ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Vansh Thakkar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # 🌟 **SoftGo - Starter Kit built on Django Framework** 🌟 3 | *Kickstart your software or project development with prebuilt authentication and dashboard features!* 4 | 5 | ### 🚀 **What is SoftGo?** 6 | SoftGo (Software + Django) is your go-to Django starter kit, designed to help developers—quickly set up the foundational elements of a project or software. With all essential features like login, signup, dynamic user dashboards, running Asynchronous functions in backend, and remember-me functionality, you can skip the repetitive tasks and focus directly on building your actual use case. SoftGo takes care of the groundwork, allowing you to move fast and build smarter! 7 | 8 | ### 💡 **Why SoftGo?** 9 | SoftGo is perfect for those who want to hit the ground running without having to waste time building basic authentication, dashboard management, or user sessions from scratch. If you're a student, hackathon participant, freelancer, or developer looking for a head start in Django-based projects, **SoftGo** is built for you! 💼 10 | 11 | ### ✨ **Key Features** 12 | - 🔐 **Authentication Done Right**: Seamless user registration, login, and logout functionalities, complete with password and email validation. 13 | - 🛠 **Dynamic Dashboard**: Once logged in, users see a general dashboard with their profile and details dynamically populated from signup data. 14 | - ⏳ **Persistent Login**: Users who click "Remember Me" stay logged in for **two weeks**, skipping the login process unless they manually log out. 15 | - 📱 **Responsive Design**: Every page, including the login, registration, and dashboard pages, is fully responsive! 💻 📱 16 | - 🚪 **Logout and Session Handling**: Easy user session management with built-in Django tools. 17 | - ⏳ **Asynchronous task Handeling**: Using Django Q, you can now run python functions asynchrnously. 18 | 19 | ⚠️ **Note for Production**: 20 | If you're using **SoftGo** in production, **do not use the Tailwind CDN** (currently used for development). Instead, switch to the **Django-Tailwind package**. You can find the documentation [here](https://django-tailwind.readthedocs.io/en/latest/). 21 | 22 | ### 🔥 **How to Get Started?** 23 | Setting up SoftGo is a breeze! Follow these steps: 24 | 1. **Clone the repository**: 25 | ```bash 26 | git clone https://github.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps.git 27 | cd softgo 28 | ``` 29 | 2. **Install dependencies**: 30 | ```bash 31 | pip install -r requirements.txt 32 | ``` 33 | 3. **Run database migrations**: 34 | ```bash 35 | python manage.py migrate 36 | ``` 37 | 4. **Start the development server**: 38 | ```bash 39 | python manage.py runserver 40 | ``` 41 | 5. **Start Qcluster worker for enabling Asynchronous and Parallel Processing in another terminal**: 42 | ```bash 43 | python manage.py qcluster 44 | ``` 45 | 7. **You're all set!** 🎉 Just visit `http://127.0.0.1:8000` to explore SoftGo in action! 46 | 47 | ### ⚠️ **Known Issue** 48 | 🚧 **Landing Page Not Fully Responsive** 49 | While SoftGo offers a super responsive experience for the **login**, **signup**, and **dashboard** pages, the **landing page** could use some love! If you’re a developer looking to make an open-source contribution, this is a great opportunity to improve your CV! Contributions to the landing page’s design will be highly appreciated. 💡 50 | 51 | ### 📚 **Documentation** 52 | Check out the official [Django documentation](https://docs.djangoproject.com/en/stable/) for more detailed guidance on extending SoftGo to suit your specific use case. 53 | 54 | --- 55 | 56 | ## 🚀 Future Updates & Features 57 | 58 | **SoftGo** is just getting started! 🎉 Expect more exciting features and improvements in the future as we continue to enhance this starter kit for quick and easy project development. We aim to bring new features that streamline user experiences and make SoftGo even more powerful for developers and students. 59 | 60 | Some planned updates include: 61 | - 📈 Advanced analytics dashboard 62 | - 🔒 Enhanced security features 63 | - 🛠️ Customizable themes for the dashboard 64 | - 🌐 Improved landing page responsiveness (open for contributions) 65 | 66 | ## 🌟 Open Source Contributions Welcome! 67 | 68 | We strongly believe in the power of community and open source collaboration. That's why we invite **you** to contribute to **SoftGo**! Whether it's improving the landing page's responsiveness, adding new features, fixing bugs, or suggesting ideas, your contributions are highly valued and will not only help improve **SoftGo**, but also **boost your tech profile**. Contributing to open source is a great way to gain experience, learn new skills, and showcase your work to potential employers. 69 | 70 | If you'd like to get involved: 71 | - 💡 Fork the repo and create a pull request 72 | - 📄 Check out the contribution guidelines 73 | - 🙌 Join the discussion and share your ideas! 74 | 75 | --- 76 | 77 | ### 📝 **License** 78 | SoftGo is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. 79 | 80 | --- 81 | 82 | ### 👤 **Author** 83 | *Written by Vansh Thakkar* 84 | -------------------------------------------------------------------------------- /authentication/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps/249e5f1f4c394dfbbb4435a84085a1324a6cb739/authentication/__init__.py -------------------------------------------------------------------------------- /authentication/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /authentication/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AuthenticationConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'authentication' 7 | -------------------------------------------------------------------------------- /authentication/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps/249e5f1f4c394dfbbb4435a84085a1324a6cb739/authentication/migrations/__init__.py -------------------------------------------------------------------------------- /authentication/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /authentication/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /authentication/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path,include 2 | from django.shortcuts import render 3 | from . import views 4 | 5 | urlpatterns = [ 6 | path('login/', views.login_page_render, name="login_page_render"), 7 | path('register/', views.register_page_render, name="register_page_render"), 8 | path('register_user/', views.register, name='register'), 9 | path('login_user/', views.login_user, name='login'), 10 | path('logout/', views.logout_user, name='logout') 11 | ] -------------------------------------------------------------------------------- /authentication/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render,redirect 2 | from django.contrib.auth.models import User 3 | from django.contrib import messages 4 | from django.core.exceptions import ValidationError 5 | from django.contrib.auth import authenticate, login, logout 6 | from django.conf import settings 7 | # Create your views here. 8 | def login_page_render(request): 9 | return render(request, 'authentication/login.html') 10 | 11 | def register_page_render(request): 12 | return render(request, 'authentication/user_reg.html') 13 | def register(request): 14 | if request.method == 'POST': 15 | first_name = request.POST.get('first_name') 16 | last_name = request.POST.get('last_name') 17 | username = request.POST.get('username') 18 | email = request.POST.get('email-id') 19 | password = request.POST.get('password') 20 | confirm_password = request.POST.get('confirm_password') 21 | 22 | if password != confirm_password: 23 | messages.error(request, 'Password and Confirm Password do not match!') 24 | return render(request, 'authentication/user_reg.html') 25 | 26 | if User.objects.filter(username=username).exists(): 27 | messages.error(request, 'Username is already taken!') 28 | return render(request, 'authentication/user_reg.html') 29 | 30 | if User.objects.filter(email=email).exists(): 31 | messages.error(request, 'Email is already registered!') 32 | return render(request, 'authentication/user_reg.html') 33 | 34 | try: 35 | user = User.objects.create_user( 36 | username=username, 37 | email=email, 38 | first_name=first_name, 39 | last_name=last_name, 40 | password=password 41 | ) 42 | user.save() 43 | messages.success(request, f'User {username} created successfully!') 44 | return redirect('/') 45 | except ValidationError as e: 46 | messages.error(request, 'An error occurred during registration: ' + str(e)) 47 | return render(request, 'authentication/user_reg.html') 48 | 49 | return render(request, 'authentication/user_reg.html') 50 | 51 | def login_user(request): 52 | if request.method == 'POST': 53 | username = request.POST.get('username') 54 | password = request.POST.get('password') 55 | 56 | user = authenticate(request, username=username, password=password) 57 | 58 | if user is not None: 59 | login(request,user) 60 | 61 | # Set session to never expire unless user logs out (persistent login) 62 | if not request.POST.get('remember_me'): # Assuming 'remember_me' is a checkbox 63 | request.session.set_expiry(0) # Session expires when the browser is closed 64 | else: 65 | request.session.set_expiry(settings.SESSION_COOKIE_AGE) # Default session age (usually 2 weeks) 66 | 67 | messages.success(request, f"Welcome back, {username}!") 68 | return redirect(f'/dashboard/{username}') 69 | 70 | else: 71 | messages.error(request, 'Invalid username or password.') 72 | 73 | return render(request, 'authentication/login.html') 74 | 75 | def logout_user(request): 76 | logout(request) 77 | messages.success(request, 'You have been logged out successfully.') 78 | return redirect('/') -------------------------------------------------------------------------------- /home/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps/249e5f1f4c394dfbbb4435a84085a1324a6cb739/home/__init__.py -------------------------------------------------------------------------------- /home/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /home/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps/249e5f1f4c394dfbbb4435a84085a1324a6cb739/home/migrations/__init__.py -------------------------------------------------------------------------------- /home/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /home/tasks.py: -------------------------------------------------------------------------------- 1 | # Define all the functions you want to execute asynchronously(Parallely) in django views in qcluster worker 2 | 3 | def softgo_greet(): 4 | print("Django Q cluster Running, Parrallel Asynchronous Worker active.") 5 | return 1 -------------------------------------------------------------------------------- /home/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /home/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path,include 2 | from django.shortcuts import render 3 | from . import views 4 | 5 | urlpatterns = [ 6 | path('', views.landing, name="landing"), 7 | path('dashboard//', views.render_dashboard, name="render_dashboard"), 8 | path('auto_clustering//', views.auto_clustering, name="auto_clustering"), 9 | path('explore_topics//', views.explore_topics, name="explore_topics"), 10 | path('search_papers//', views.search_papers, name="search_papers"), 11 | 12 | ] -------------------------------------------------------------------------------- /home/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.contrib.auth.decorators import login_required 3 | from django_q.tasks import async_task 4 | 5 | # Create your views here. 6 | def landing(request): 7 | if request.user: 8 | context={'username':request.user.username} 9 | return render(request, 'home/landing/landing.html', context) 10 | else: 11 | return render(request, 'home/landing/landing.html') 12 | 13 | @login_required 14 | def render_dashboard(request,username): 15 | user=request.user 16 | async_task('home.tasks.softgo_greet') 17 | context={'username':user.username, 'first_name':user.first_name, 'last_name':user.last_name, 'email': user.email} 18 | return render(request, 'home/dashboard_main.html',context) 19 | 20 | @login_required 21 | def auto_clustering(request,username): 22 | user=request.user 23 | context={'username':user.username, 'first_name':user.first_name, 'last_name':user.last_name, 'email': user.email} 24 | return render(request, 'home/render_auto_clustering.html',context) 25 | 26 | @login_required 27 | def explore_topics(request,username): 28 | user=request.user 29 | context={'username':user.username, 'first_name':user.first_name, 'last_name':user.last_name, 'email': user.email} 30 | return render(request, 'home/render_explore_topics.html',context) 31 | 32 | @login_required 33 | def search_papers(request,username): 34 | user=request.user 35 | context={'username':user.username, 'first_name':user.first_name, 'last_name':user.last_name, 'email': user.email} 36 | return render(request, 'home/render_search_papers.html',context) -------------------------------------------------------------------------------- /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', 'softgo.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 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | ansicon==1.89.0 2 | arrow==1.3.0 3 | asgiref==3.8.1 4 | blessed==1.20.0 5 | Django==3.2 6 | django-picklefield==3.2 7 | django-q==1.3.9 8 | jinxed==1.3.0 9 | python-dateutil==2.9.0.post0 10 | pytz==2024.2 11 | redis==3.5.3 12 | setuptools==75.2.0 13 | six==1.16.0 14 | sqlparse==0.5.1 15 | types-python-dateutil==2.9.0.20241003 16 | tzdata==2024.1 17 | wcwidth==0.2.13 18 | -------------------------------------------------------------------------------- /softgo/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps/249e5f1f4c394dfbbb4435a84085a1324a6cb739/softgo/__init__.py -------------------------------------------------------------------------------- /softgo/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for softgo 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/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'softgo.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /softgo/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for softgo project. 3 | 4 | Generated by 'django-admin startproject' using Django 5.0.4. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/5.0/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | import os 15 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 16 | BASE_DIR = Path(__file__).resolve().parent.parent 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'django-insecure-u-(ukp$f-iba7q%w2ey(5qq&!dx%ikep*cfqhfk1^%z4(6p5k-' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = ['*'] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 'django_q', 41 | 'authentication', 42 | 'home' 43 | ] 44 | 45 | MIDDLEWARE = [ 46 | 'django.middleware.security.SecurityMiddleware', 47 | 'django.contrib.sessions.middleware.SessionMiddleware', 48 | 'django.middleware.common.CommonMiddleware', 49 | 'django.middleware.csrf.CsrfViewMiddleware', 50 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 | 'django.contrib.messages.middleware.MessageMiddleware', 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53 | ] 54 | 55 | ROOT_URLCONF = 'softgo.urls' 56 | 57 | TEMPLATES = [ 58 | { 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 | 'DIRS': [BASE_DIR / 'templates'], 61 | 'APP_DIRS': True, 62 | 'OPTIONS': { 63 | 'context_processors': [ 64 | 'django.template.context_processors.debug', 65 | 'django.template.context_processors.request', 66 | 'django.contrib.auth.context_processors.auth', 67 | 'django.contrib.messages.context_processors.messages', 68 | ], 69 | }, 70 | }, 71 | ] 72 | 73 | WSGI_APPLICATION = 'softgo.wsgi.application' 74 | 75 | 76 | # Database 77 | # https://docs.djangoproject.com/en/5.0/ref/settings/#databases 78 | 79 | DATABASES = { 80 | 'default': { 81 | 'ENGINE': 'django.db.backends.sqlite3', 82 | 'NAME': BASE_DIR / 'db.sqlite3', 83 | } 84 | } 85 | 86 | 87 | # Password validation 88 | # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators 89 | 90 | AUTH_PASSWORD_VALIDATORS = [ 91 | { 92 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 93 | }, 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 102 | }, 103 | ] 104 | 105 | 106 | # Internationalization 107 | # https://docs.djangoproject.com/en/5.0/topics/i18n/ 108 | 109 | LANGUAGE_CODE = 'en-us' 110 | 111 | TIME_ZONE = 'UTC' 112 | 113 | USE_I18N = True 114 | 115 | USE_TZ = True 116 | 117 | 118 | # Static files (CSS, JavaScript, Images) 119 | # https://docs.djangoproject.com/en/5.0/howto/static-files/ 120 | 121 | STATIC_URL = 'static/' 122 | 123 | # Default primary key field type 124 | # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field 125 | 126 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 127 | 128 | 129 | 130 | STATIC_URL = '/static/' 131 | STATIC_ROOT = BASE_DIR / 'staticfiles' 132 | 133 | STATICFILES_DIRS = [ 134 | BASE_DIR / 'static', 135 | ] 136 | 137 | 138 | 139 | MEDIA_URL = '/media/' 140 | MEDIA_ROOT = BASE_DIR / 'media' 141 | 142 | 143 | SESSION_COOKIE_AGE = 1209600 144 | SESSION_EXPIRE_AT_BROWSER_CLOSE = False 145 | SESSION_COOKIE_SECURE = True 146 | 147 | #Django Q settings 148 | Q_CLUSTER = { 149 | 'name': 'DjangoQCluster', 150 | 'workers': 4, # Adjust based on your server capacity 151 | 'recycle': 500, 152 | 'timeout': 60, 153 | 'retry': 120, 154 | 'queue_limit': 50, 155 | 'bulk': 10, 156 | 'orm': 'default', # Use Django ORM for task persistence 157 | } -------------------------------------------------------------------------------- /softgo/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL configuration for softgo project. 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/5.0/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 | 22 | urlpatterns = [ 23 | path('admin/', admin.site.urls), 24 | path('authentication/', include('authentication.urls')), 25 | path('',include("home.urls")) 26 | ] 27 | if settings.DEBUG: 28 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -------------------------------------------------------------------------------- /softgo/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for softgo 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/5.0/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', 'softgo.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /static/authentication/images/login_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps/249e5f1f4c394dfbbb4435a84085a1324a6cb739/static/authentication/images/login_img.png -------------------------------------------------------------------------------- /static/authentication/images/register_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps/249e5f1f4c394dfbbb4435a84085a1324a6cb739/static/authentication/images/register_img.png -------------------------------------------------------------------------------- /static/home/images/dash-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/VanshPT/SoftGo-Starter-Kit-Quick-Setup-for-Django-Apps/249e5f1f4c394dfbbb4435a84085a1324a6cb739/static/home/images/dash-1.png -------------------------------------------------------------------------------- /static/home/landing.css: -------------------------------------------------------------------------------- 1 | .custom-list-item { 2 | margin-left: 2.5rem; 3 | } 4 | 5 | .custom-dt { 6 | color: #202938; 7 | font-weight: 600; /* Tailwind's font-semibold */ 8 | } 9 | 10 | .custom-dd { 11 | color: #4b5563; /* Tailwind's text-gray-600 */ 12 | } 13 | /* Custom CSS to replicate Tailwind styles */ 14 | .relative { 15 | position: relative; 16 | } 17 | 18 | .flex { 19 | display: flex; 20 | align-items: center; 21 | } 22 | 23 | .custom-svg { 24 | height: 2rem; /* Adjust the height as needed */ 25 | width: 2rem; /* Adjust the width as needed */ 26 | margin-right: 1rem; /* Adjust the margin as needed */ 27 | } 28 | /* Custom CSS to refine section appearance */ 29 | @media (min-width: 1024px) { 30 | .lg\:flex-row-reverse { 31 | flex-direction: row-reverse !important; 32 | } 33 | .lg\:pl-8 { 34 | padding-left: 2rem !important; /* Adjust as needed */ 35 | } 36 | } 37 | 38 | /* Container styling */ 39 | .overflow-hidden { 40 | overflow: hidden; 41 | } 42 | 43 | .py-12 { 44 | padding-top: 3rem; 45 | padding-bottom: 3rem; 46 | } 47 | 48 | .bg-gradient-to-b { 49 | background-image: linear-gradient(to bottom, #ffffff, #f9fafb); 50 | } 51 | 52 | /* Max width container */ 53 | .max-w-7xl { 54 | max-width: 80rem; 55 | margin-left: auto; 56 | margin-right: auto; 57 | } 58 | 59 | /* Inner container */ 60 | .px-4 { 61 | padding-left: 1rem; 62 | padding-right: 1rem; 63 | } 64 | 65 | .sm\:px-6 { 66 | @media (min-width: 640px) { 67 | padding-left: 1.5rem; 68 | padding-right: 1.5rem; 69 | } 70 | } 71 | 72 | .lg\:px-8 { 73 | @media (min-width: 1024px) { 74 | padding-left: 2rem; 75 | padding-right: 2rem; 76 | } 77 | } 78 | 79 | /* Flex container */ 80 | .flex { 81 | display: flex; 82 | } 83 | 84 | .flex-col-reverse { 85 | flex-direction: column-reverse; 86 | } 87 | 88 | .lg\:flex-row { 89 | @media (min-width: 1024px) { 90 | flex-direction: row; 91 | } 92 | } 93 | 94 | .lg\:items-center { 95 | @media (min-width: 1024px) { 96 | align-items: center; 97 | } 98 | } 99 | 100 | /* Product section */ 101 | .custom-product { 102 | margin-top: 2rem; 103 | } 104 | 105 | /* Left column */ 106 | .lg\:w-1\/2 { 107 | @media (min-width: 1024px) { 108 | width: 50%; 109 | } 110 | } 111 | 112 | .max-w-lg { 113 | max-width: 42rem; 114 | margin-right: 1rem; 115 | } 116 | 117 | .text-3xl { 118 | font-size: 1.875rem; 119 | } 120 | 121 | .font-semibold { 122 | font-weight: 600; 123 | } 124 | 125 | .text-gray-900 { 126 | color: #4a5568; 127 | } 128 | 129 | .mt-4 { 130 | margin-top: 1rem; 131 | } 132 | 133 | .text-lg { 134 | font-size: 1.125rem; 135 | } 136 | 137 | /* Description list */ 138 | .space-y-4 > * + * { 139 | margin-top: 1rem; 140 | } 141 | 142 | /* Right column */ 143 | .mt-10 { 144 | margin-top: 2.5rem; 145 | } 146 | 147 | .lg\:pl-8 { 148 | @media (min-width: 1024px) { 149 | padding-left: 2rem; 150 | } 151 | } 152 | 153 | .w-full { 154 | width: 100%; 155 | } 156 | 157 | .rounded-lg { 158 | border-radius: 0.5rem; 159 | } 160 | 161 | .shadow-lg { 162 | box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); 163 | } 164 | .wider-img { 165 | width: 100%; /* Adjust the width as needed */ 166 | max-width: 700px; /* Maximum width for the image */ 167 | } 168 | 169 | /* Adjust the margins to push the content to the right */ 170 | .lg\:pl-8 { 171 | @media (min-width: 1024px) { 172 | padding-left: 4rem; /* Increase the padding to push content to the right */ 173 | } 174 | } 175 | /* Image */ 176 | img { 177 | margin-left:1rem; 178 | display: block; 179 | max-width: 100%; 180 | height: auto; 181 | } 182 | #product{ 183 | background-color: rgb(17 24 39); /* Dark greyish blue color */ 184 | color: white; /* Text color for better readability */ 185 | padding: 3rem 0; 186 | } 187 | .dark-mode-bg { 188 | background-color: rgb(17 24 39); /* Dark greyish blue color */ 189 | color: white!important; /* Text color for better readability */ 190 | padding: 3rem 0; /* Add padding to the section */ 191 | } 192 | #features { 193 | color: #fff; 194 | padding-top: 6rem; 195 | padding-bottom: 6rem; 196 | } 197 | 198 | #features h2 { 199 | color: rgb(0, 0, 255); 200 | } 201 | 202 | #features .bg-indigo-600 { 203 | background-color: rgb(0, 0, 255); 204 | } 205 | 206 | #features .text-indigo-600 { 207 | color: rgb(0, 0, 255); 208 | } 209 | 210 | .flex-custom { 211 | display: flex; 212 | flex-direction: row; 213 | justify-content: space-between; 214 | align-items: center; 215 | gap: 2rem; /* Adjust the gap between the dl elements */ 216 | } 217 | 218 | .margg-l-2 { 219 | margin-left: 2rem; 220 | } 221 | 222 | /* Adjust the gap between dl elements */ 223 | .flex-custom dl { 224 | margin-bottom: 2rem; /* Increase vertical gap between dl elements */ 225 | } 226 | 227 | /* Adjust spacing within dl elements */ 228 | .flex-custom dt, .flex-custom dd { 229 | margin-bottom: 1rem; 230 | } 231 | .bg-custom{ 232 | background-color: rgb(0, 0, 255); 233 | } 234 | .text-custom{ 235 | color: rgb(0, 0, 255); 236 | } 237 | 238 | .main-logo-design { 239 | font-size: 1.8rem; 240 | color: #202938; 241 | font-family: "Kanit", sans-serif; 242 | font-weight: 700; 243 | font-style: normal; 244 | } 245 | .add-class-logo-40{ 246 | font-size: 1.8rem; 247 | color: #ff7f50; 248 | font-family: "Kanit", sans-serif; 249 | font-weight: 700; 250 | font-style: normal; 251 | } 252 | .aboutus-bg { 253 | background: url('https://images.unsplash.com/photo-1521737604893-d14cc237f11d?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&crop=focalpoint&fp-y=.8&w=2830&h=1500&q=80&blend=111827&sat=-100&exp=15&blend-mode=multiply') no-repeat center center/cover; 254 | background-color: #1a202c; 255 | } 256 | /* Custom CSS for Footer */ 257 | footer { 258 | background-color: #ffffff; /* White background */ 259 | border-radius: 0.5rem; /* Rounded corners */ 260 | box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); /* Shadow */ 261 | margin: 1rem; /* Margin */ 262 | padding: 1rem; /* Padding */ 263 | } 264 | 265 | footer a { 266 | color: #4a5568; /* Gray text color */ 267 | text-decoration: none; /* Remove underline */ 268 | transition: color 0.3s ease; /* Smooth transition */ 269 | } 270 | 271 | footer a:hover { 272 | color: #2d3748; /* Darker text color on hover */ 273 | } 274 | 275 | footer ul { 276 | display: flex; 277 | flex-wrap: wrap; 278 | justify-content: center; 279 | margin-top: 0.75rem; /* Spacing above list */ 280 | padding: 0; /* Remove default padding */ 281 | list-style: none; /* Remove bullet points */ 282 | } 283 | 284 | footer ul li { 285 | margin-right: 1.5rem; /* Spacing between list items */ 286 | } 287 | 288 | footer ul li:last-child { 289 | margin-right: 0; /* No margin on the last item */ 290 | } 291 | .flex-custom{ 292 | display:flex; 293 | flex-direction:row; 294 | justify-content:space-around; 295 | align-items:center; 296 | } 297 | .margg-custom-first{ 298 | margin:10rem 10rem; 299 | 300 | } 301 | .rounded-md { 302 | border-radius: 0.375rem; /* 6px rounded corners */ 303 | } 304 | .bg-orange { 305 | background-color: #ff7f50; /* Orange color */ 306 | } 307 | .text-white { 308 | color: #ffffff; /* White text */ 309 | } 310 | .hover\:bg-orange-300:hover { 311 | background-color: #ffa07a; /* Lighter shade of orange on hover */ 312 | } 313 | .focus-visible\:outline { 314 | outline: 2px solid transparent; 315 | outline-offset: 2px; 316 | } 317 | .focus-visible\:outline-2:focus { 318 | outline: 2px solid #4f46e5; /* Indigo 600 outline on focus */ 319 | } 320 | .product_image_1_no_anim{ 321 | border-radius:8px; 322 | margin-right:5rem; 323 | width: 1000px; 324 | } 325 | 326 | .text-orange{ 327 | color:#ff7f50; 328 | } 329 | .back-orange{ 330 | background-color:#ff7f50; 331 | } 332 | .product_image_2{ 333 | width:90%; 334 | border-radius:8px; 335 | } 336 | /* Default navbar style (without .nav-applied-10) */ 337 | nav { 338 | width: 100%; 339 | z-index: 1000; 340 | transition: background-color 0.3s ease, color 0.3s ease; 341 | } 342 | 343 | /* Navbar style after scrolling 10px */ 344 | .nav-applied-40 { 345 | position: fixed; 346 | top: 0; 347 | width: 100%; 348 | z-index: 1000; 349 | background-color: #202938; 350 | transition: background-color 0.3s ease; 351 | } 352 | 353 | /* White text inside the navbar after scrolling */ 354 | .nav-applied-40 a { 355 | color: white; 356 | } 357 | -------------------------------------------------------------------------------- /static/home/landing.js: -------------------------------------------------------------------------------- 1 | window.addEventListener('scroll', function () { 2 | const navbar = document.querySelector('nav'); 3 | const logo = document.querySelector('#logo-main'); 4 | 5 | if (window.scrollY > 40) { 6 | navbar.classList.add('nav-applied-40'); 7 | logo.classList.add('add-class-logo-40'); 8 | } else { 9 | navbar.classList.remove('nav-applied-40'); 10 | logo.classList.remove('add-class-logo-40'); 11 | } 12 | }); 13 | 14 | /* Button Hover Animation */ 15 | const buttons = document.querySelectorAll('button'); 16 | buttons.forEach(button => { 17 | button.addEventListener('mouseenter', () => { 18 | button.style.transform = 'scale(1.05)'; /* Zoom effect */ 19 | }); 20 | 21 | button.addEventListener('mouseleave', () => { 22 | button.style.transform = 'scale(1)'; /* Reset zoom */ 23 | }); 24 | }); 25 | 26 | /* Interactive Image Animation */ 27 | const images = document.querySelectorAll('.product_image_1'); 28 | images.forEach(image => { 29 | image.addEventListener('mouseenter', () => { 30 | image.style.transform = 'scale(1.05)'; /* Image zoom on hover */ 31 | image.style.boxShadow = '0 12px 24px rgba(0, 0, 0, 0.5)'; /* Shadow depth */ 32 | }); 33 | 34 | image.addEventListener('mouseleave', () => { 35 | image.style.transform = 'scale(1)'; 36 | image.style.boxShadow = 'none'; /* Reset shadow */ 37 | }); 38 | }); 39 | const links = document.querySelectorAll('nav a[href^="#"]'); 40 | 41 | links.forEach(link => { 42 | link.addEventListener('click', function(event) { 43 | event.preventDefault(); // Prevent default anchor click behavior 44 | const targetId = this.getAttribute('href'); // Get the target section ID 45 | const targetSection = document.querySelector(targetId); // Find the section 46 | 47 | // Smooth scroll to the section 48 | targetSection.scrollIntoView({ 49 | behavior: 'smooth', // Smooth scrolling 50 | block: 'start', // Align to the start of the section 51 | }); 52 | }); 53 | }); 54 | 55 | // js to handle responsiveness of landing pages hamburger icon 56 | document.getElementById('hamburger-btn').addEventListener('click', function () { 57 | document.getElementById('mobile-menu').classList.toggle('menu-open'); 58 | }); 59 | -------------------------------------------------------------------------------- /templates/authentication/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% load static %} 5 | 6 | 7 | Login Page 8 | 9 | 10 | 56 | 57 | 58 | {% include 'partials/message_popup.html' %} 59 | {% if messages %} 60 | 66 | {% endif %} 67 | 68 | 69 |
70 | 93 |
94 | 95 | 96 |
97 | 98 |
99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /templates/authentication/user_reg.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% load static %} 5 | 6 | 7 | Registration Page 8 | 9 | 10 | 46 | 47 | 48 | {% include 'partials/message_popup.html' %} 49 | {% if messages %} 50 | 56 | {% endif %} 57 | 58 | 59 | 60 | 61 |
62 |
63 |

Register

64 |
65 | {% csrf_token %} 66 |
67 | 68 | 69 |
70 |
71 | 72 | 73 |
74 |
75 | 76 | 77 |
78 |
79 | 80 | 81 |
82 |
83 | 84 | 85 | 86 | 89 | 90 |
91 |
92 | 93 | 94 | 95 | 98 | 99 |
100 | 101 |
102 |

Already have an account? Log in

103 |
104 |
105 | 106 | 107 |
108 | 109 |
110 | 111 | 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /templates/home/dashboard.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% block title %}{% endblock %} 9 | 21 | {% block css %} {% endblock %} 22 | 23 | 24 | {% include 'partials/message_popup.html' %} {% if messages %} 25 | 31 | {% endif %} 32 |
33 | 37 | 38 |
39 |
44 | 45 |
49 |
50 |
51 | 52 | SoftGo 53 |
54 |
55 | 56 | 153 |
154 |
155 |
158 |
159 | 178 | 179 |
180 | 181 | 186 | 193 | 194 | 195 | 196 | 201 |
202 |
203 | 204 |
205 | 304 | 305 |
306 | 314 | 315 | 321 | 322 | 376 |
377 |
378 |
379 | {% block body %}{% endblock %} 380 |
381 |
382 |
383 | {% block js %} 384 | {% endblock %} 385 | 386 | 387 | -------------------------------------------------------------------------------- /templates/home/dashboard_main.html: -------------------------------------------------------------------------------- 1 | {% extends 'home/dashboard.html' %} 2 | {% block title %}Upload Paper{% endblock %} 3 | {% block upload %}text-gray-100 bg-gray-700 bg-opacity-25{% endblock %} 4 | {% block auto_clustering %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100 {% endblock %} 5 | {% block explore_topics %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 6 | {% block search_papers %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 7 | {% block history %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 8 | {% block css %}{% endblock %} 9 | {% block body %} 10 | {% comment %} edit below content to make a new page, keep rest contents same, to make the second ex- auto clustering link active, add the text-gray-100... classes of upload to auto clustering and add text-gray-500... classes to rest link blocks {% endcomment %} 11 |
12 |
13 |

Dashboard

14 | 15 |
16 |
17 |
18 |
19 |
20 | 22 | 25 | 28 | 31 | 34 | 37 | 40 | 41 |
42 | 43 |
44 |

8,282

45 |
New Users
46 |
47 |
48 |
49 | 50 |
51 |
52 |
53 | 55 | 58 | 61 | 64 | 65 |
66 | 67 |
68 |

200,521

69 |
Total Orders
70 |
71 |
72 |
73 | 74 |
75 |
76 |
77 | 79 | 81 | 84 | 85 |
86 | 87 |
88 |

215,542

89 |
Available Products
90 |
91 |
92 |
93 |
94 |
95 | 96 |
97 | 98 |
99 | 100 |
101 |
102 |
104 | 105 | 106 | 107 | 110 | 113 | 116 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 140 | 141 | 145 | 146 | 150 | 151 | 154 | 155 | 159 | 160 | 161 | 176 | 177 | 181 | 182 | 186 | 187 | 190 | 191 | 195 | 196 | 197 | 212 | 213 | 217 | 218 | 222 | 223 | 226 | 227 | 231 | 232 | 233 | 248 | 249 | 253 | 254 | 258 | 259 | 262 | 263 | 267 | 268 | 269 | 284 | 285 | 289 | 290 | 294 | 295 | 298 | 299 | 303 | 304 | 305 | 320 | 321 | 325 | 326 | 330 | 331 | 334 | 335 | 339 | 340 | 341 | 356 | 357 | 361 | 362 | 366 | 367 | 370 | 371 | 375 | 376 | 377 | 392 | 393 | 397 | 398 | 402 | 403 | 406 | 407 | 411 | 412 | 413 |
109 | Name 112 | Title 115 | Status 118 | Role
126 |
127 |
128 | 131 |
132 | 133 |
134 |
John Doe 135 |
136 |
john@example.com
137 |
138 |
139 |
142 |
Software Engineer
143 |
Web dev
144 |
147 | Active 149 | 153 | Owner 157 | Edit 158 |
162 |
163 |
164 | 167 |
168 | 169 |
170 |
John Doe 171 |
172 |
john@example.com
173 |
174 |
175 |
178 |
Software Engineer
179 |
Web dev
180 |
183 | Active 185 | 189 | Owner 193 | Edit 194 |
198 |
199 |
200 | 203 |
204 | 205 |
206 |
John Doe 207 |
208 |
john@example.com
209 |
210 |
211 |
214 |
Software Engineer
215 |
Web dev
216 |
219 | Active 221 | 225 | Owner 229 | Edit 230 |
234 |
235 |
236 | 239 |
240 | 241 |
242 |
John Doe 243 |
244 |
john@example.com
245 |
246 |
247 |
250 |
Software Engineer
251 |
Web dev
252 |
255 | Active 257 | 261 | Owner 265 | Edit 266 |
270 |
271 |
272 | 275 |
276 | 277 |
278 |
John Doe 279 |
280 |
john@example.com
281 |
282 |
283 |
286 |
Software Engineer
287 |
Web dev
288 |
291 | Active 293 | 297 | Owner 301 | Edit 302 |
306 |
307 |
308 | 311 |
312 | 313 |
314 |
John Doe 315 |
316 |
john@example.com
317 |
318 |
319 |
322 |
Software Engineer
323 |
Web dev
324 |
327 | Active 329 | 333 | Owner 337 | Edit 338 |
342 |
343 |
344 | 347 |
348 | 349 |
350 |
John Doe 351 |
352 |
john@example.com
353 |
354 |
355 |
358 |
Software Engineer
359 |
Web dev
360 |
363 | Active 365 | 369 | Owner 373 | Edit 374 |
378 |
379 |
380 | 383 |
384 | 385 |
386 |
John Doe 387 |
388 |
john@example.com
389 |
390 |
391 |
394 |
Software Engineer
395 |
Web dev
396 |
399 | Active 401 | 405 | Owner 409 | Edit 410 |
414 |
415 |
416 |
417 |
418 |
. 419 | {% comment %} edit till here to make a new page {% endcomment %} 420 | {% endblock %} 421 | {% block js %}{% endblock %} -------------------------------------------------------------------------------- /templates/home/landing/landing.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% load static %} 5 | 6 | 7 | Intellipaper 8 | 9 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {% include 'partials/message_popup.html' %} 22 | {% if messages %} 23 | 29 | {% endif %} 30 | 31 |
32 |
33 | {% include 'home/landing/navbar.html' %} 34 | 35 | 102 |
103 | 104 |
105 | 133 |
134 |
135 | 146 |
147 |

150 | Empower Your Projects with Intelligent Cost Optimization and Business Insights 151 |

152 |

153 | Our project management tool combines robust task tracking and collaboration features with real-time cloud cost optimization. 154 | Manage your projects efficiently while keeping a close eye on cloud expenditures, receive proactive budget alerts, and get actionable recommendations to save costs all from a single dashboard. 155 | Simplify your workflow and maximize your cloud investments with our integrated solution. 156 |

157 |
158 | 160 | Get started 161 | 162 | 163 | 164 | Already a User? 167 |
168 |
169 |
170 |
171 | product_image_1 172 |
173 |
174 | 202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 | product_image_1 210 |
211 |
212 |
213 |

Our Product

214 |

Streamline project management with integrated cloud cost optimization and insightful business intelligence. 215 | Manage tasks efficiently, receive real-time cost alerts, and leverage data-driven insights for informed decision-making

216 |
217 |
218 |
219 | 222 |
223 |
224 |
Task Management:
225 |
Efficiently track and collaborate on tasks and projects.
226 |
227 |
228 |
229 |
230 | 233 |
234 |
235 |
Business Intelligence Insights:
236 |
Gain actionable insights to enhance decision-making and project outcomes.
237 |
238 |
239 |
240 |
241 | 245 |
246 |
247 |
Cloud Cost Management:
248 |
Monitor and optimize cloud expenditures with proactive management tools.
249 |
250 |
251 |
252 |
253 |
254 | 255 | 256 |
257 |
258 |
259 | 260 |
261 | 262 |
263 |
264 |
265 | 266 |

Everything you need to know about our features

267 |

Explore how our integrated platform enhances project management

268 |
269 |
270 | 271 | 272 |
273 |
274 |
275 |
276 |
277 | 280 |
281 | Task Management: 282 |
283 |
Streamline task tracking and collaboration.
284 |
285 |
286 |
287 |
288 | 291 |
292 | Cloud Cost Management: 293 |
294 |
Optimize expenses with real-time monitoring.
295 |
296 |
297 |
298 |
299 | 302 |
303 | Business Intelligence Insights: 304 |
305 |
Make informed decisions with actionable analytics
306 |
307 |
308 |
309 |
310 | 313 |
314 | Custom Dashboards: 315 |
316 |
Tailor views for personalized project and cost visibility.
317 |
318 |
319 | 320 | 321 |
322 |
323 |
324 | 325 |
326 |
327 |
328 |

About Us

329 |

Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat aliqua.

330 |
331 |
332 |
333 |
334 |
335 |

Open roles

336 |

Consequat posuere massa malesuada nunc facilisis venenatis commodo ultrices varius malesuada malesuada metus.

337 |
338 |
339 |
340 |
341 |

Internship program

342 |

Consequat posuere massa malesuada nunc facilisis venenatis commodo ultrices varius malesuada malesuada metus.

343 |
344 |
345 |
346 |
347 |
348 |
349 |

Our values

350 |

Consequat posuere massa malesuada nunc facilisis venenatis commodo ultrices varius malesuada malesuada metus.

351 |
352 |
353 |
354 |
355 |

Meet our leadership

356 |

Consequat posuere massa malesuada nunc facilisis venenatis commodo ultrices varius malesuada malesuada metus.

357 |
358 |
359 |
360 |
361 |
362 |
Offices worldwide
363 |
12
364 |
365 |
366 |
Full-time colleagues
367 |
300+
368 |
369 |
370 |
Hours per week
371 |
40
372 |
373 |
374 |
Paid time off
375 |
Unlimited
376 |
377 |
378 |
379 |
380 |
381 | 382 | 402 | 403 | 404 | -------------------------------------------------------------------------------- /templates/home/landing/navbar.html: -------------------------------------------------------------------------------- 1 | 58 | -------------------------------------------------------------------------------- /templates/home/render_auto_clustering.html: -------------------------------------------------------------------------------- 1 | {% extends 'home/dashboard.html' %} 2 | {% block title %}Auto Clustering{% endblock %} 3 | {% block upload %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 4 | {% block auto_clustering %}text-gray-100 bg-gray-700 bg-opacity-25 {% endblock %} 5 | {% block explore_topics %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 6 | {% block search_papers %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 7 | {% block history %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 8 | {% block css %} 9 | 54 | {% endblock %} 55 | {% block body %} 56 | {% comment %} edit below content to make a new page, keep rest contents same, to make the second ex- auto clustering link active, add the text-gray-100... classes of upload to auto clustering and add text-gray-500... classes to rest link blocks {% endcomment %} 57 |

Auto Clustering Page

58 |

Welcome to the Auto Clustering page! Here’s how you can customize this page:

59 | 60 |
61 |

Instructions to Modify This Page

62 |
    63 |
  1. Rename the URL: Change the URL pattern in urls.py: 64 |
    65 | path('auto_clustering//', views.auto_clustering, name='auto_clustering')
    66 |             
    67 | to something like: 68 |
    69 | path('my_clustering//', views.my_clustering, name='my_clustering')
    70 |             
    71 |
  2. 72 |
  3. Change the View: In views.py, rename the function: 73 |
    74 | def auto_clustering(request, username):
    75 |     ...
    76 |             
    77 | to: 78 |
    79 | def my_clustering(request, username):
    80 |     ...
    81 |             
    82 |
  4. 83 |
  5. Update the Template: Rename this template file from auto_clustering.html to my_clustering.html and update the template_name in your view accordingly.
  6. 84 |
85 |
86 | {% comment %} edit till here to make a new page {% endcomment %} 87 | {% endblock %} 88 | {% block js %}{% endblock %} 89 | -------------------------------------------------------------------------------- /templates/home/render_explore_topics.html: -------------------------------------------------------------------------------- 1 | {% extends 'home/dashboard.html' %} 2 | {% block title %}Explore Topics{% endblock %} 3 | {% block upload %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 4 | {% block auto_clustering %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 5 | {% block explore_topics %}text-gray-100 bg-gray-700 bg-opacity-25 {% endblock %} 6 | {% block search_papers %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 7 | {% block history %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 8 | {% block css %} 9 | 54 | {% endblock %} 55 | {% block body %} 56 | {% comment %} edit below content to make a new page, keep rest contents same, to make the explore topics link active, add the text-gray-100... classes of upload to explore topics and add text-gray-500... classes to rest link blocks {% endcomment %} 57 |

Explore Topics Page

58 |

Welcome to the Explore Topics page! Here’s how you can customize this page:

59 | 60 |
61 |

Instructions to Modify This Page

62 |
    63 |
  1. Rename the URL: Change the URL pattern in urls.py: 64 |
    65 | path('explore_topics//', views.explore_topics, name='explore_topics')
    66 |             
    67 | to something like: 68 |
    69 | path('my_topics//', views.my_topics, name='my_topics')
    70 |             
    71 |
  2. 72 |
  3. Change the View: In views.py, rename the function: 73 |
    74 | def explore_topics(request, username):
    75 |     ...
    76 |             
    77 | to: 78 |
    79 | def my_topics(request, username):
    80 |     ...
    81 |             
    82 |
  4. 83 |
  5. Update the Template: Rename this template file from explore_topics.html to my_topics.html and update the template_name in your view accordingly.
  6. 84 |
85 |
86 | {% comment %} edit till here to make a new page {% endcomment %} 87 | {% endblock %} 88 | {% block js %}{% endblock %} 89 | -------------------------------------------------------------------------------- /templates/home/render_search_papers.html: -------------------------------------------------------------------------------- 1 | {% extends 'home/dashboard.html' %} 2 | {% block title %}Search Papers{% endblock %} 3 | {% block upload %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 4 | {% block auto_clustering %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 5 | {% block explore_topics %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 6 | {% block search_papers %}text-gray-100 bg-gray-700 bg-opacity-25 {% endblock %} 7 | {% block history %}text-gray-500 hover:bg-gray-700 hover:bg-opacity-25 hover:text-gray-100{% endblock %} 8 | {% block css %} 9 | 54 | {% endblock %} 55 | {% block body %} 56 | {% comment %} edit below content to make a new page, keep rest contents same, to make the search papers link active, add the text-gray-100... classes of upload to search papers and add text-gray-500... classes to rest link blocks {% endcomment %} 57 |

Search Papers Page

58 |

Welcome to the Search Papers page! Here’s how you can customize this page:

59 | 60 |
61 |

Instructions to Modify This Page

62 |
    63 |
  1. Rename the URL: Change the URL pattern in urls.py: 64 |
    65 | path('search_papers//', views.search_papers, name='search_papers')
    66 |             
    67 | to something like: 68 |
    69 | path('my_search//', views.my_search, name='my_search')
    70 |             
    71 |
  2. 72 |
  3. Change the View: In views.py, rename the function: 73 |
    74 | def search_papers(request, username):
    75 |     ...
    76 |             
    77 | to: 78 |
    79 | def my_search(request, username):
    80 |     ...
    81 |             
    82 |
  4. 83 |
  5. Update the Template: Rename this template file from search_papers.html to my_search.html and update the template_name in your view accordingly.
  6. 84 |
85 |
86 | {% comment %} edit till here to make a new page {% endcomment %} 87 | {% endblock %} 88 | {% block js %}{% endblock %} 89 | -------------------------------------------------------------------------------- /templates/home/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [require('@tailwindcss/forms'),] 3 | }; 4 | -------------------------------------------------------------------------------- /templates/partials/message_popup.html: -------------------------------------------------------------------------------- 1 | 22 | 23 |
24 | 25 | 30 |
31 | 57 | --------------------------------------------------------------------------------