Skip to content

Commit 9dfc6e3

Browse files
Feat: Add created_by, updated_by to conf tables (#421)
1 parent 47828f4 commit 9dfc6e3

File tree

17 files changed

+162
-26
lines changed

17 files changed

+162
-26
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 3.2.14 on 2025-01-08 08:17
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('fyle', '0022_support_split_expense_grouping'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='expensegroupsettings',
15+
name='created_by',
16+
field=models.CharField(blank=True, help_text='Email of the user who created this record', max_length=255, null=True),
17+
),
18+
migrations.AddField(
19+
model_name='expensegroupsettings',
20+
name='updated_by',
21+
field=models.CharField(blank=True, help_text='Email of the user who last updated this record', max_length=255, null=True),
22+
),
23+
]

apps/fyle/models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from django.db import models
1313
from django.db.models import Count, JSONField
1414
from fyle_accounting_mappings.models import ExpenseAttribute
15+
from fyle_accounting_mappings.mixins import AutoAddCreateUpdateInfoMixin
1516

1617
from apps.fyle.enums import ExpenseStateEnum, FundSourceEnum, PlatformExpensesEnum
1718
from apps.workspaces.models import Workspace, WorkspaceGeneralSettings
@@ -277,7 +278,7 @@ def get_default_split_expense_grouping():
277278
)
278279

279280

280-
class ExpenseGroupSettings(models.Model):
281+
class ExpenseGroupSettings(AutoAddCreateUpdateInfoMixin, models.Model):
281282
"""
282283
ExpenseGroupCustomizationSettings
283284
"""
@@ -338,7 +339,7 @@ class Meta:
338339
db_table = "expense_group_settings"
339340

340341
@staticmethod
341-
def update_expense_group_settings(expense_group_settings: Dict, workspace_id: int):
342+
def update_expense_group_settings(expense_group_settings: Dict, workspace_id: int, user):
342343
settings = ExpenseGroupSettings.objects.get(workspace_id=workspace_id)
343344
current_reimbursable_settings = list(settings.reimbursable_expense_group_fields)
344345
current_ccc_settings = list(settings.corporate_credit_card_expense_group_fields)
@@ -434,6 +435,7 @@ def update_expense_group_settings(expense_group_settings: Dict, workspace_id: in
434435
"import_card_credits": import_card_credits,
435436
'split_expense_grouping': expense_group_settings['split_expense_grouping'],
436437
},
438+
user=user
437439
)
438440

439441

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 3.2.14 on 2025-01-08 08:17
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('mappings', '0006_auto_20220909_1206'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='generalmapping',
15+
name='created_by',
16+
field=models.CharField(blank=True, help_text='Email of the user who created this record', max_length=255, null=True),
17+
),
18+
migrations.AddField(
19+
model_name='generalmapping',
20+
name='updated_by',
21+
field=models.CharField(blank=True, help_text='Email of the user who last updated this record', max_length=255, null=True),
22+
),
23+
]

apps/mappings/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.db import models
55

66
from apps.workspaces.models import Workspace
7+
from fyle_accounting_mappings.mixins import AutoAddCreateUpdateInfoMixin
78

89

910
class TenantMapping(models.Model):
@@ -34,7 +35,7 @@ def get_tenant_details(workspace_id):
3435
return TenantMapping.objects.get(workspace_id=workspace_id)
3536

3637

37-
class GeneralMapping(models.Model):
38+
class GeneralMapping(AutoAddCreateUpdateInfoMixin, models.Model):
3839
"""
3940
General Mapping
4041
"""

apps/workspaces/apis/advanced_settings/serializers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ def get_workspace_id(self, instance):
8282
return instance.id
8383

8484
def update(self, instance, validated):
85+
request = self.context.get('request')
86+
user = request.user if request and hasattr(request, 'user') else None
87+
8588
workspace_general_settings = validated.pop("workspace_general_settings")
8689
general_mappings = validated.pop("general_mappings")
8790
workspace_schedules = validated.pop("workspace_schedules")
@@ -111,6 +114,7 @@ def update(self, instance, validated):
111114
"auto_create_merchant_destination_entity"
112115
),
113116
},
117+
user=user
114118
)
115119

116120
GeneralMapping.objects.update_or_create(
@@ -121,6 +125,7 @@ def update(self, instance, validated):
121125
),
122126
"payment_account_id": general_mappings.get("payment_account").get("id"),
123127
},
128+
user=user
124129
)
125130

126131
schedule_sync(

apps/workspaces/apis/advanced_settings/views.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,12 @@ class AdvancedSettingsView(generics.RetrieveUpdateAPIView):
99

1010
def get_object(self):
1111
return Workspace.objects.filter(id=self.kwargs["workspace_id"]).first()
12+
13+
def get_serializer_context(self):
14+
"""
15+
Override to include the request in the serializer context.
16+
This allows serializers to access the current user.
17+
"""
18+
context = super().get_serializer_context()
19+
context['request'] = self.request
20+
return context

apps/workspaces/apis/export_settings/serializers.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ def get_workspace_id(self, instance):
101101
return instance.id
102102

103103
def update(self, instance, validated):
104+
request = self.context.get('request')
105+
user = request.user if request and hasattr(request, 'user') else None
106+
104107
workspace_general_settings = validated.pop("workspace_general_settings")
105108
expense_group_settings = validated.pop("expense_group_settings")
106109
general_mappings = validated.pop("general_mappings")
@@ -132,6 +135,7 @@ def update(self, instance, validated):
132135
],
133136
"map_merchant_to_contact": map_merchant_to_contact,
134137
},
138+
user=user
135139
)
136140

137141
expense_group_settings["import_card_credits"] = False
@@ -148,6 +152,7 @@ def update(self, instance, validated):
148152
"import_to_fyle": False,
149153
"is_custom": False,
150154
},
155+
user=user
151156
)
152157
expense_group_settings["import_card_credits"] = True
153158

@@ -181,14 +186,15 @@ def update(self, instance, validated):
181186
expense_group_settings["ccc_export_date_type"] = "spent_at"
182187

183188
ExpenseGroupSettings.update_expense_group_settings(
184-
expense_group_settings, workspace_id=workspace_id
189+
expense_group_settings, workspace_id=workspace_id, user=user
185190
)
186191
GeneralMapping.objects.update_or_create(
187192
workspace=instance,
188193
defaults={
189194
"bank_account_name": general_mappings.get("bank_account").get("name"),
190195
"bank_account_id": general_mappings.get("bank_account").get("id"),
191196
},
197+
user=user
192198
)
193199

194200
if instance.onboarding_state == "EXPORT_SETTINGS":

apps/workspaces/apis/export_settings/views.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,12 @@ class ExportSettingsView(generics.RetrieveUpdateAPIView):
99

1010
def get_object(self):
1111
return Workspace.objects.filter(id=self.kwargs["workspace_id"]).first()
12+
13+
def get_serializer_context(self):
14+
"""
15+
Override to include the request in the serializer context.
16+
This allows serializers to access the current user.
17+
"""
18+
context = super().get_serializer_context()
19+
context['request'] = self.request
20+
return context

apps/workspaces/apis/import_settings/serializers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ def get_workspace_id(self, instance):
104104
return instance.id
105105

106106
def update(self, instance, validated):
107+
request = self.context.get('request')
108+
user = request.user if request and hasattr(request, 'user') else None
109+
107110
workspace_general_settings = validated.pop("workspace_general_settings")
108111
general_mappings = validated.pop("general_mappings")
109112
mapping_settings = validated.pop("mapping_settings")
@@ -139,6 +142,7 @@ def update(self, instance, validated):
139142
"import_suppliers_as_merchants"
140143
),
141144
},
145+
user=user
142146
)
143147

144148
GeneralMapping.objects.update_or_create(
@@ -151,6 +155,7 @@ def update(self, instance, validated):
151155
"id"
152156
),
153157
},
158+
user=user
154159
)
155160

156161
trigger.post_save_workspace_general_settings(
@@ -203,6 +208,7 @@ def update(self, instance, validated):
203208
if "source_placeholder" in setting
204209
else None,
205210
},
211+
user=user
206212
)
207213

208214
trigger.post_save_mapping_settings(workspace_general_settings_instance)

apps/workspaces/apis/import_settings/views.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,12 @@ class ImportSettingsView(generics.RetrieveUpdateAPIView):
99

1010
def get_object(self):
1111
return Workspace.objects.filter(id=self.kwargs["workspace_id"]).first()
12+
13+
def get_serializer_context(self):
14+
"""
15+
Override to include the request in the serializer context.
16+
This allows serializers to access the current user.
17+
"""
18+
context = super().get_serializer_context()
19+
context['request'] = self.request
20+
return context

0 commit comments

Comments
 (0)