Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion FusionIIIT/Fusion/settings/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
https://docs.djangoproject.com/en/1.11/ref/settings/
'''
import os
import sys

from celery.schedules import crontab

Expand Down Expand Up @@ -259,7 +260,10 @@
# os.path.join(BASE_DIR, 'static/')
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '..', 'static')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
if 'test' in sys.argv:
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
else:
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
MEDIA_ROOT = os.path.join(BASE_DIR, '..', 'media')
MEDIA_URL = '/media/'

Expand Down
2 changes: 1 addition & 1 deletion FusionIIIT/Fusion/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
url(r'^estate/', include('applications.estate_module.urls')),
url(r'^dep/', include('applications.department.urls')),
url(r'^programme_curriculum/',include('applications.programme_curriculum.urls')),
url(r'^iwdModuleV2/', include('applications.iwdModuleV2.urls')),
url(r'^iwdModuleV2/api/', include('applications.iwdModuleV2.api.urls')),
url(r'^__debug__/', include(debug_toolbar.urls)),
url(r'^research_procedures/', include('applications.research_procedures.urls')),
url(r'^accounts/', include('allauth.urls')),
Expand Down
1 change: 1 addition & 0 deletions FusionIIIT/applications/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Package marker for Django app discovery.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.1.5 on 2026-04-13 16:27

from django.db import migrations, models


class Migration(migrations.Migration):

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

operations = [
migrations.AlterField(
model_name='student',
name='specialization',
field=models.CharField(choices=[('Power and Control', 'Power and Control'), ('Power & Control', 'Power & Control'), ('Microwave and Communication Engineering', 'Microwave and Communication Engineering'), ('Communication and Signal Processing', 'Communication and Signal Processing'), ('Micro-nano Electronics', 'Micro-nano Electronics'), ('Nanoelectronics and VLSI Design', 'Nanoelectronics and VLSI Design'), ('CAD/CAM', 'CAD/CAM'), ('Design', 'Design'), ('Manufacturing', 'Manufacturing'), ('Manufacturing and Automation', 'Manufacturing and Automation'), ('CSE', 'CSE'), ('AI & ML', 'AI & ML'), ('Data Science', 'Data Science'), ('Mechatronics', 'Mechatronics'), ('MDes', 'MDes'), ('None', 'None'), ('', 'No Specialization')], default='', max_length=40, null=True),
),
]
11 changes: 0 additions & 11 deletions FusionIIIT/applications/central_mess/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,17 +149,6 @@ class Migration(migrations.Migration):
('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')),
],
),
migrations.CreateModel(
name='Payments',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('amount_paid', models.IntegerField(default=0)),
('payment_month', models.CharField(default=applications.central_mess.models.current_month, max_length=20)),
('payment_year', models.IntegerField(default=applications.central_mess.models.current_year)),
('payment_date', models.DateField(default=datetime.date(2024, 6, 19))),
('student_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='academic_information.student')),
],
),
migrations.CreateModel(
name='Mess_minutes',
fields=[
Expand Down
53 changes: 53 additions & 0 deletions FusionIIIT/applications/eis/migrations/0003_auto_20260413_1627.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Generated by Django 3.1.5 on 2026-04-13 16:27

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('eis', '0002_auto_20250201_2228'),
]

operations = [
migrations.AlterField(
model_name='emp_achievement',
name='a_year',
field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024), (2025, 2025), (2026, 2026)], null=True, verbose_name='year'),
),
migrations.AlterField(
model_name='emp_confrence_organised',
name='k_year',
field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024), (2025, 2025), (2026, 2026)], null=True, verbose_name='year'),
),
migrations.AlterField(
model_name='emp_expert_lectures',
name='l_year',
field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024), (2025, 2025), (2026, 2026)], null=True, verbose_name='year'),
),
migrations.AlterField(
model_name='emp_keynote_address',
name='k_year',
field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024), (2025, 2025), (2026, 2026)], null=True, verbose_name='year'),
),
migrations.AlterField(
model_name='emp_mtechphd_thesis',
name='s_year',
field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024), (2025, 2025), (2026, 2026)], null=True, verbose_name='year'),
),
migrations.AlterField(
model_name='emp_patents',
name='p_year',
field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024), (2025, 2025), (2026, 2026)], null=True, verbose_name='year'),
),
migrations.AlterField(
model_name='emp_published_books',
name='pyear',
field=models.IntegerField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024), (2025, 2025), (2026, 2026)], null=True, verbose_name='year'),
),
migrations.AlterField(
model_name='emp_research_papers',
name='year',
field=models.CharField(blank=True, choices=[(1995, 1995), (1996, 1996), (1997, 1997), (1998, 1998), (1999, 1999), (2000, 2000), (2001, 2001), (2002, 2002), (2003, 2003), (2004, 2004), (2005, 2005), (2006, 2006), (2007, 2007), (2008, 2008), (2009, 2009), (2010, 2010), (2011, 2011), (2012, 2012), (2013, 2013), (2014, 2014), (2015, 2015), (2016, 2016), (2017, 2017), (2018, 2018), (2019, 2019), (2020, 2020), (2021, 2021), (2022, 2022), (2023, 2023), (2024, 2024), (2025, 2025), (2026, 2026)], max_length=10, null=True),
),
]
107 changes: 107 additions & 0 deletions FusionIIIT/applications/iwdModuleV2/Designated_Roles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Module Name: IWD Module V2

## Designated User Roles & Permissions

### 1. Role Name: Request Initiator (Engineer / HOD / Dean)

* **Description:** Creates maintenance requests and starts the workflow. Students are explicitly blocked from creating requests.

* **Permissions:**

* Create new IWD requests (non-student authenticated users only).

* Must use a held designation as sender role.

* New requests can only be forwarded to `Admin IWD` at creation time.

* View own created requests and file/request status views.

### 2. Role Name: IWD Admin

* **Description:** Primary operational approver and workflow controller for IWD requests.

* **Permissions:**

* Approve or reject requests at the first approval stage (`handle-admin-approval`).

* Set next stage to HOD/Dean after approval.

* Issue work orders (along with allowed roles configured in API).

* Add vendors, process bills, and participate in financial flow.

* Access request/budget/inventory/SLA views used for module operations.

### 3. Role Name: HOD / Dean Approver

* **Description:** Second-level approver in the mandatory sequential approval chain.

* **Permissions:**

* Can process requests only if user holds one of configured HOD/Dean designations.

* Approve/reject at dean/HOD stage (`handle-dean-process-request`).

* On approve, can forward only to `Director` designation.

* On reject, request is marked rejected at dean/HOD stage.

### 4. Role Name: Director

* **Description:** Final approver for the request approval workflow.

* **Permissions:**

* Approve or reject requests at director stage (`handle-director-approval`).

* Director approval requires prior IWD Admin approval and dean/HOD processing.

* Final approval marks request fully approved for work order issuance.

### 5. Role Name: Engineer (Execution Role)

* **Description:** Execution-side role responsible for proposal/work progress updates.

* **Permissions:**

* Create proposals and submit updates tied to requests.

* Mark work as completed (`work-completed`).

* Access engineer-facing workflow endpoints (processed/in-progress views).

### 6. Role Name: Auditor

* **Description:** Audits generated bills before settlement.

* **Permissions:**

* Audit bill documents (`audit-document`).

* Forward audited items to `Accounts Admin` stage.

* Audit must occur after bill generation.

### 7. Role Name: Accounts Admin

* **Description:** Financial closure role for bill processing and settlement.

* **Permissions:**

* Process bills (`handle-process-bills`) and move them through payment workflow.

* Settle final bills (`handle-settle-bill-request`).

* Participate in work order issuance and vendor/billing operations where permitted.

### 8. Role Name: Authenticated End User (General Access)

* **Description:** Logged-in module user with baseline read/access actions.

* **Permissions:**

* Access common read endpoints (file views, status lists, generated bill views, feedback history, SLA/inventory dashboards).

* Submit feedback and reopen requests where workflow conditions permit.

* Read-only usage does not grant stage-approval authority.
1 change: 1 addition & 0 deletions FusionIIIT/applications/iwdModuleV2/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Package marker\n
79 changes: 58 additions & 21 deletions FusionIIIT/applications/iwdModuleV2/admin.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,60 @@
from django.contrib import admin

from .models import Projects,PageOneDetails,AESDetails,PageTwoDetails,CorrigendumTable,Addendum,PreBidDetails,TechnicalBidDetails,TechnicalBidContractorDetails,FinancialBidDetails,FinancialContractorDetails,LetterOfIntentDetails,WorkOrderForm,Agreement,Milestones,PageThreeDetails,ExtensionOfTimeDetails,NoOfTechnicalBidTimes

# Register your models here.
admin.site.register(Projects)
admin.site.register(PageOneDetails)
admin.site.register(AESDetails)
admin.site.register(PageTwoDetails)
admin.site.register(CorrigendumTable)
admin.site.register(Addendum)
admin.site.register(PreBidDetails)
admin.site.register(TechnicalBidDetails)
admin.site.register(TechnicalBidContractorDetails)
admin.site.register(FinancialBidDetails)
admin.site.register(FinancialContractorDetails)
admin.site.register(LetterOfIntentDetails)
admin.site.register(WorkOrderForm)
admin.site.register(Agreement)
admin.site.register(Milestones)
admin.site.register(PageThreeDetails)
admin.site.register(ExtensionOfTimeDetails)
admin.site.register(NoOfTechnicalBidTimes)
from .models import BillItems
from .models import Bills
from .models import Budget
from .models import Item
from .models import Proposal
from .models import Requests
from .models import Vendor
from .models import WorkOrder


@admin.register(Requests)
class RequestsAdmin(admin.ModelAdmin):
list_display = ("id", "name", "requestCreatedBy", "status", "creationTime")
list_filter = ("iwdAdminApproval", "directorApproval", "deanProcessed", "issuedWorkOrder")
search_fields = ("name", "area", "requestCreatedBy")


@admin.register(Proposal)
class ProposalAdmin(admin.ModelAdmin):
list_display = ("id", "request", "created_by", "proposal_budget", "status", "created_at")
list_filter = ("status",)
search_fields = ("created_by",)


@admin.register(Item)
class ItemAdmin(admin.ModelAdmin):
list_display = ("id", "proposal", "name", "quantity", "price_per_unit", "total_price")
search_fields = ("name",)


@admin.register(WorkOrder)
class WorkOrderAdmin(admin.ModelAdmin):
list_display = ("id", "request_id", "name", "estimate_budget", "start_date", "completion_date")
search_fields = ("name", "work_issuer")


@admin.register(Vendor)
class VendorAdmin(admin.ModelAdmin):
list_display = ("id", "work", "name", "contact_number", "email_address", "total_amount")
search_fields = ("name", "contact_number", "email_address")


@admin.register(Bills)
class BillsAdmin(admin.ModelAdmin):
list_display = ("id", "vendor", "audit", "settle", "total_amount", "billtype")
list_filter = ("audit", "settle", "billtype")


@admin.register(BillItems)
class BillItemsAdmin(admin.ModelAdmin):
list_display = ("id", "bill", "name", "quantity", "price")
search_fields = ("name",)


@admin.register(Budget)
class BudgetAdmin(admin.ModelAdmin):
list_display = ("id", "name", "budgetIssued")
search_fields = ("name",)
Loading
Loading