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
45 changes: 27 additions & 18 deletions FusionIIIT/Fusion/middleware/custom_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,35 +19,44 @@ def user_logged_in_handler(sender, user, request, **kwargs):
design = HoldsDesignation.objects.select_related('user','designation').filter(working=request.user)

designation=[]
if str(user.extrainfo.user_type) == "student":
designation.append(str(user.extrainfo.user_type))
try:
user_type = str(user.extrainfo.user_type)
except ExtraInfo.DoesNotExist:
user_type = None

if user_type == "student":
designation.append(user_type)


for i in design:
if str(i.designation) != str(user.extrainfo.user_type):
if str(i.designation) != str(user_type):
print('-------')
print(i.designation)
print(user.extrainfo.user_type)
print(user_type)
print('')
designation.append(str(i.designation))

for i in designation:
print(i)

request.session['currentDesignationSelected'] = designation[0]
request.session['allDesignations'] = designation
first_designation = designation[0]
module_access = ModuleAccess.objects.filter(designation=first_designation).first()

if module_access:
access_rights = {}

field_names = [field.name for field in ModuleAccess._meta.get_fields() if field.name not in ['id', 'designation']]

for field_name in field_names:
access_rights[field_name] = getattr(module_access, field_name)

request.session['moduleAccessRights'] = access_rights
if designation:
request.session['currentDesignationSelected'] = designation[0]
request.session['allDesignations'] = designation
first_designation = designation[0]
else:
request.session['currentDesignationSelected'] = ""
request.session['allDesignations'] = []
first_designation = None

access_rights = {}
if first_designation:
module_access = ModuleAccess.objects.filter(designation=first_designation).first()
if module_access:
field_names = [field.name for field in ModuleAccess._meta.get_fields() if field.name not in ['id', 'designation']]
for field_name in field_names:
access_rights[field_name] = getattr(module_access, field_name)

request.session['moduleAccessRights'] = access_rights
print("logged iN")

# Set the flag in the session to indicate that the function has bee+n executed
Expand Down
1 change: 1 addition & 0 deletions FusionIIIT/Fusion/settings/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@
'applications.hr2',
'applications.department',
'applications.iwdModuleV2',
'applications.patent_system.apps.PatentsystemConfig',
'allauth',
'allauth.account',
'allauth.socialaccount',
Expand Down
1 change: 1 addition & 0 deletions FusionIIIT/Fusion/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
url(r'^recruitment/', include('applications.recruitment.urls')),
url(r'^examination/', include('applications.examination.urls')),
url(r'^otheracademic/', include('applications.otheracademic.urls')),
url(r'^patentsystem/', include('applications.patent_system.api.urls')),

path(
'password-reset/',
Expand Down
138 changes: 138 additions & 0 deletions FusionIIIT/applications/patent_system/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
from django.contrib import admin, messages
from django.db import transaction

# Ensure globals admin registrations are loaded before we attach actions.
import applications.globals.admin # noqa: F401
from applications.globals.models import Designation, ExtraInfo, HoldsDesignation

from .models import (
Applicant,
Application,
ApplicationSectionI,
ApplicationSectionII,
ApplicationSectionIII,
AssociatedWith,
Attorney,
BudgetApproval,
CommunicationLog,
ConflictDeclaration,
Document,
DocumentVersion,
ExternalFilingRecord,
InventorConsent,
LegalAssessment,
MaintenanceSchedule,
NotificationEvent,
OfficeAction,
OfficeActionResponse,
)


def _get_or_create_designation(name, full_name, designation_type):
designation = Designation.objects.filter(name__iexact=name).first()
if designation:
updated = False
if not designation.full_name:
designation.full_name = full_name
updated = True
if not designation.type:
designation.type = designation_type
updated = True
if updated:
designation.save(update_fields=["full_name", "type"])
return designation

return Designation.objects.create(
name=name,
full_name=full_name,
type=designation_type,
)


def _assign_designation_to_user(user, designation):
# Keep working=user so middleware and role switching stay consistent.
_, created = HoldsDesignation.objects.get_or_create(
user=user,
designation=designation,
defaults={"working": user},
)
return created


def assign_patent_director_and_pcc_admin(modeladmin, request, queryset):
"""Assign Director + PCC Admin role(s) to selected user(s)"""
director_designation = _get_or_create_designation(
name="Director",
full_name="Director",
designation_type="administrative",
)
pcc_admin_designation = _get_or_create_designation(
name="PCC Admin",
full_name="PCC Admin",
designation_type="administrative",
)

users = [obj.user for obj in queryset.select_related("user")]
if not users:
modeladmin.message_user(request, "No users selected.", level=messages.WARNING)
return

director_created_count = 0
pcc_created_count = 0

with transaction.atomic():
for user in users:
if _assign_designation_to_user(user, director_designation):
director_created_count += 1
if _assign_designation_to_user(user, pcc_admin_designation):
pcc_created_count += 1

modeladmin.message_user(
request,
(
f"Processed {len(users)} user(s). "
f"New Director assignments: {director_created_count}. "
f"New PCC Admin assignments: {pcc_created_count}."
),
level=messages.SUCCESS,
)


assign_patent_director_and_pcc_admin.short_description = "Patent: assign Director + PCC Admin role(s)"


# Attach role-assignment action to already-registered ExtraInfo admin safely.
extra_info_admin = admin.site._registry.get(ExtraInfo)
if extra_info_admin:
existing_actions = list(getattr(extra_info_admin, "actions", []) or [])
if assign_patent_director_and_pcc_admin not in existing_actions:
existing_actions.append(assign_patent_director_and_pcc_admin)
extra_info_admin.actions = existing_actions


# Register patent-system models for admin visibility.
PATENT_MODELS = [
Applicant,
Attorney,
Application,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Accessing admin.site._registry is fragile (private API). _registry is an internal Django dict and can be renamed or restructured in a future Django release without a deprecation notice. A safer approach:

admin.site.unregister(ExtraInfo)

class ExtraInfoAdmin(existing_class):
    actions = [..., assign_patent_director_and_pcc_admin]

admin.site.register(ExtraInfo, ExtraInfoAdmin)

ApplicationSectionI,
ApplicationSectionII,
ApplicationSectionIII,
AssociatedWith,
Document,
CommunicationLog,
ConflictDeclaration,
LegalAssessment,
NotificationEvent,
BudgetApproval,
ExternalFilingRecord,
MaintenanceSchedule,
DocumentVersion,
InventorConsent,
OfficeAction,
OfficeActionResponse,
]

for model in PATENT_MODELS:
if model not in admin.site._registry:
admin.site.register(model)
Empty file.
145 changes: 145 additions & 0 deletions FusionIIIT/applications/patent_system/api/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
from rest_framework import serializers
from ..models import (
AppealRequest,
Attorney,
AuditLog,
BudgetApproval,
CommunicationLog,
ConflictDeclaration,
Document,
DocumentVersion,
ExternalFilingRecord,
InventorConsent,
LegalAdviceMemo,
LegalAssessment,
LicensingRequest,
MaintenanceSchedule,
NotificationEvent,
OfficeAction,
OfficeActionResponse,
PriorArtReference,
)

class AttorneySerializer(serializers.ModelSerializer):
class Meta:
model = Attorney
fields = ['id', 'name', 'email', 'phone', 'firm_name']

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AttorneySerializer is missing the three new fields added to Attorney in this PR. expertise_domain, is_panel_approved, and current_workload are all missing from fields. The frontend will never see these values until the serializer is updated.

read_only_fields = ['id']

class DocumentSerializer(serializers.ModelSerializer):
class Meta:
model = Document
fields = ['id', 'title', 'link', 'created_at', 'updated_at']
read_only_fields = ['id', 'created_at', 'updated_at']


class CommunicationLogSerializer(serializers.ModelSerializer):
class Meta:
model = CommunicationLog
fields = '__all__'
read_only_fields = ['id', 'application', 'logged_by', 'created_at', 'updated_at']


class ConflictDeclarationSerializer(serializers.ModelSerializer):
class Meta:
model = ConflictDeclaration
fields = '__all__'
read_only_fields = ['id', 'created_at']


class LegalAssessmentSerializer(serializers.ModelSerializer):
class Meta:
model = LegalAssessment
fields = '__all__'
read_only_fields = ['id', 'created_at']


class NotificationEventSerializer(serializers.ModelSerializer):
class Meta:
model = NotificationEvent
fields = '__all__'
read_only_fields = ['id', 'created_at']


class BudgetApprovalSerializer(serializers.ModelSerializer):
class Meta:
model = BudgetApproval
fields = '__all__'
read_only_fields = ['id', 'created_at', 'decided_at']


class ExternalFilingRecordSerializer(serializers.ModelSerializer):
class Meta:
model = ExternalFilingRecord
fields = '__all__'
read_only_fields = ['id', 'created_at']


class MaintenanceScheduleSerializer(serializers.ModelSerializer):
class Meta:
model = MaintenanceSchedule
fields = '__all__'
read_only_fields = ['id', 'created_at', 'reminder_sent_at', 'paid_at']


class DocumentVersionSerializer(serializers.ModelSerializer):
class Meta:
model = DocumentVersion
fields = '__all__'
read_only_fields = ['id', 'created_at']


class InventorConsentSerializer(serializers.ModelSerializer):
class Meta:
model = InventorConsent
fields = '__all__'
read_only_fields = ['id', 'created_at']


class OfficeActionSerializer(serializers.ModelSerializer):
class Meta:
model = OfficeAction
fields = '__all__'
read_only_fields = ['id', 'created_at']


class OfficeActionResponseSerializer(serializers.ModelSerializer):
class Meta:
model = OfficeActionResponse
fields = '__all__'
read_only_fields = ['id', 'created_at']


class LicensingRequestSerializer(serializers.ModelSerializer):
class Meta:
model = LicensingRequest
fields = '__all__'
read_only_fields = ['id', 'created_at']


class AppealRequestSerializer(serializers.ModelSerializer):
class Meta:
model = AppealRequest
fields = '__all__'
read_only_fields = ['id', 'created_at']


class PriorArtReferenceSerializer(serializers.ModelSerializer):
class Meta:
model = PriorArtReference
fields = '__all__'
read_only_fields = ['id', 'created_at']


class LegalAdviceMemoSerializer(serializers.ModelSerializer):
class Meta:
model = LegalAdviceMemo
fields = '__all__'
read_only_fields = ['id', 'created_at']


class AuditLogSerializer(serializers.ModelSerializer):
class Meta:
model = AuditLog
fields = '__all__'
read_only_fields = ['id', 'created_at']
Loading
Loading