129 lines
5.1 KiB
Python
129 lines
5.1 KiB
Python
import re
|
|
|
|
def refactor_create_view():
|
|
with open('expenses/views.py', 'r', encoding='utf-8') as f:
|
|
content = f.read()
|
|
|
|
old_create_view = """@login_required
|
|
@transaction.atomic # Integridad de datos
|
|
def expense_create(request):
|
|
# Only allow creation if user is admin or allowed to
|
|
if request.method == 'POST':
|
|
form = ExpenseForm(request.POST, request.FILES)
|
|
if form.is_valid():
|
|
expense = form.save(commit=False)
|
|
expense.user = request.user
|
|
# Auto convert to USD if CLP
|
|
setting, _ = SystemSetting.objects.get_or_create(id=1)
|
|
if expense.currency == CurrencyEnum.CLP:
|
|
expense.amount_usd = expense.amount_clp / setting.usd_exchange_rate
|
|
else:
|
|
expense.amount_usd = expense.amount_clp
|
|
expense.amount_clp = expense.amount_usd * setting.usd_exchange_rate
|
|
|
|
expense.save()
|
|
|
|
receipts = request.FILES.getlist('receipt')
|
|
if receipts:
|
|
from .models import Document
|
|
import os
|
|
cat_name = expense.category.name if expense.category else 'Evidencia'
|
|
proj_code = expense.project.code if expense.project else 'PROY'
|
|
for idx, f in enumerate(receipts, start=1):
|
|
ext = os.path.splitext(f.name)[1].lower()
|
|
semantic_title = f"{proj_code} · {cat_name} · Doc {idx:02d}{ext}"
|
|
Document.objects.create(
|
|
expense=expense,
|
|
file=f,
|
|
title=semantic_title,
|
|
uploaded_by=request.user
|
|
)
|
|
|
|
AuditLog.objects.create(
|
|
user=request.user,
|
|
action="Gasto Creado",
|
|
entity_name="Expense",
|
|
entity_id=expense.expense_code,
|
|
description=f"Se creó el gasto por {expense.amount_clp} CLP"
|
|
)
|
|
messages.success(request, 'Gasto registrado exitosamente.')
|
|
return redirect('expense_list')
|
|
else:
|
|
form = ExpenseForm()
|
|
|
|
context = {
|
|
'form': form,
|
|
'regions_communes_json': json.dumps(REGIONS_COMMUNES)
|
|
}
|
|
return render(request, 'expenses/expense_form.html', context)"""
|
|
|
|
new_create_view = """from django.utils.decorators import method_decorator
|
|
|
|
@method_decorator(transaction.atomic, name='dispatch')
|
|
class ExpenseCreateView(LoginRequiredMixin, CreateView):
|
|
model = Expense
|
|
form_class = ExpenseForm
|
|
template_name = 'expenses/expense_form.html'
|
|
success_url = reverse_lazy('expense_list')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['regions_communes_json'] = json.dumps(REGIONS_COMMUNES)
|
|
return context
|
|
|
|
def form_valid(self, form):
|
|
expense = form.save(commit=False)
|
|
expense.user = self.request.user
|
|
|
|
setting, _ = SystemSetting.objects.get_or_create(id=1)
|
|
if expense.currency == CurrencyEnum.CLP:
|
|
expense.amount_usd = expense.amount_clp / setting.usd_exchange_rate
|
|
else:
|
|
expense.amount_usd = expense.amount_clp
|
|
expense.amount_clp = expense.amount_usd * setting.usd_exchange_rate
|
|
|
|
expense.save()
|
|
|
|
receipts = self.request.FILES.getlist('receipt')
|
|
if receipts:
|
|
from .models import Document
|
|
import os
|
|
cat_name = expense.category.name if expense.category else 'Evidencia'
|
|
proj_code = expense.project.code if expense.project else 'PROY'
|
|
for idx, f in enumerate(receipts, start=1):
|
|
ext = os.path.splitext(f.name)[1].lower()
|
|
semantic_title = f"{proj_code} · {cat_name} · Doc {idx:02d}{ext}"
|
|
Document.objects.create(
|
|
expense=expense,
|
|
file=f,
|
|
title=semantic_title,
|
|
uploaded_by=self.request.user
|
|
)
|
|
|
|
AuditLog.objects.create(
|
|
user=self.request.user,
|
|
action="Gasto Creado",
|
|
entity_name="Expense",
|
|
entity_id=expense.expense_code,
|
|
description=f"Se creó el gasto por {expense.amount_clp} CLP"
|
|
)
|
|
messages.success(self.request, 'Gasto registrado exitosamente.')
|
|
return super().form_valid(form)"""
|
|
|
|
content = content.replace(old_create_view, new_create_view)
|
|
|
|
with open('expenses/views.py', 'w', encoding='utf-8') as f:
|
|
f.write(content)
|
|
|
|
def refactor_urls_create():
|
|
with open('expenses/urls.py', 'r', encoding='utf-8') as f:
|
|
content = f.read()
|
|
content = content.replace("path('gastos/nuevo/', views.expense_create, name='expense_create')", "path('gastos/nuevo/', views.ExpenseCreateView.as_view(), name='expense_create')")
|
|
with open('expenses/urls.py', 'w', encoding='utf-8') as f:
|
|
f.write(content)
|
|
|
|
if __name__ == '__main__':
|
|
refactor_create_view()
|
|
refactor_urls_create()
|
|
print("Refactorización a POO completada para expense_create.")
|