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.")