import re def refactor_views(): with open('expenses/views.py', 'r', encoding='utf-8') as f: content = f.read() # Imports to add imports = """from django.views.generic import ListView, CreateView, UpdateView, DeleteView from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from .mixins import RoleRequiredMixin """ if 'ListView' not in content: content = content.replace("from django.shortcuts import render, redirect, get_object_or_404", imports + "\nfrom django.shortcuts import render, redirect, get_object_or_404") # Replace expense_list old_list_view = """@login_required def expense_list(request): expenses = Expense.objects.select_related('project', 'category', 'user').order_by('-date') # Filtros project_id = request.GET.get('project') category_id = request.GET.get('category') if project_id: expenses = expenses.filter(project_id=project_id) if category_id: expenses = expenses.filter(category_id=category_id) context = { 'expenses': expenses, 'projects': Project.objects.all(), 'categories': Category.objects.all(), 'selected_project': project_id, 'selected_category': category_id, } return render(request, 'expenses/expense_list.html', context)""" new_list_view = """class ExpenseListView(LoginRequiredMixin, ListView): model = Expense template_name = 'expenses/expense_list.html' context_object_name = 'expenses' def get_queryset(self): queryset = super().get_queryset().select_related('project', 'category', 'user').order_by('-date') project_id = self.request.GET.get('project') category_id = self.request.GET.get('category') if project_id: queryset = queryset.filter(project_id=project_id) if category_id: queryset = queryset.filter(category_id=category_id) return queryset def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['projects'] = Project.objects.all() context['categories'] = Category.objects.all() context['selected_project'] = self.request.GET.get('project') context['selected_category'] = self.request.GET.get('category') return context""" content = content.replace(old_list_view, new_list_view) with open('expenses/views.py', 'w', encoding='utf-8') as f: f.write(content) def refactor_urls(): with open('config/urls.py', 'r', encoding='utf-8') as f: content = f.read() # Check if expense_list is imported if 'expense_list' in content: content = content.replace('expense_list', 'ExpenseListView') content = content.replace("path('gastos/', views.expense_list, name='expense_list')", "path('gastos/', views.ExpenseListView.as_view(), name='expense_list')") with open('config/urls.py', 'w', encoding='utf-8') as f: f.write(content) if __name__ == '__main__': refactor_views() refactor_urls() print("Refactorización a POO (CBV) completada para expense_list.")