Как я могу объединить все эти похожие взгляды в одно? - PullRequest
0 голосов
/ 30 мая 2019

Все эти представления очень похожи, и я хотел бы объединить их в одно представление.

class SummerIntents(TemplateView):

    template_name = 'admin/hr/intent_forms/summer_intents.html'

    @user_is_staff
    def dispatch(self, request, *args, **kwargs):
        return super(SummerIntents, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(SummerIntents, self).get_context_data(**kwargs)

        # These functions are found in util.py
        update_date = get_update_date()
        active_users = get_active_users(self)

        context['summer_info'] = SummerInfo.objects.filter(employee__in=active_users, date_modified__gte=update_date.date, active=True).order_by('position','employee__last_name')
        return context

    def post(self, request, *args, **kwargs):
        context = super(SummerIntents, self).get_context_data(**kwargs)
        file_name = "summer_intent_forms"

        update_date = get_update_date()
        active_users = get_active_users(self)
        info = SummerInfo.objects.filter(employee__in=active_users, date_modified__gte=update_date.date, active=True).order_by('position','employee__last_name')
        student_intents = get_student_intents(active_users, update_date, 'summer', info)

        return intents_to_csv(student_intents, file_name)


class WinterIntents(TemplateView):

    template_name = 'admin/hr/intent_forms/winter_intents.html'

    @user_is_staff
    def dispatch(self, request, *args, **kwargs):
        return super(WinterIntents, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(WinterIntents, self).get_context_data(**kwargs)

        # These functions are found in util.py
        update_date = get_update_date()
        active_users = get_active_users(self)

        context['winter_info'] = WinterInfo.objects.filter(employee__in=active_users, date_modified__gte=update_date.date, active=True).order_by('position','employee__last_name')
        return context

    def post(self, request, *args, **kwargs):
        context = super(WinterIntents, self).get_context_data(**kwargs)
        file_name = "winter_intent_forms"

        update_date = get_update_date()
        active_users = get_active_users(self)
        info = WinterInfo.objects.filter(employee__in=active_users, date_modified__gte=update_date.date, active=True).order_by('position','employee__last_name')
        student_intents = get_student_intents(active_users, update_date, 'winter', info)

        return intents_to_csv(student_intents, file_name)


class FallIntents(TemplateView):

    template_name = 'admin/hr/intent_forms/fall_intents.html'

    @user_is_staff
    def dispatch(self, request, *args, **kwargs):
        return super(FallIntents, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(FallIntents, self).get_context_data(**kwargs)

        # These functions are found in util.py
        update_date = get_update_date()
        active_users = get_active_users(self)

        context['fall_info'] = FallInfo.objects.filter(employee__in=active_users, date_modified__gte=update_date.date, active=True).order_by('position','employee__last_name')
        return context

    def post(self, request, *args, **kwargs):
        context = super(FallIntents, self).get_context_data(**kwargs)
        file_name = "fall_intent_forms"

        update_date = get_update_date()
        active_users = get_active_users(self)
        info = FallInfo.objects.filter(employee__in=active_users, date_modified__gte=update_date.date, active=True).order_by('position','employee__last_name')
        student_intents = get_student_intents(active_users, update_date, 'fall')

        return intents_to_csv(student_intents, file_name, info)

Я открыт для одного основного представления, от которого все они наследуются, но значит ли это, что мне нужно передать некоторые переменные через контекст? Такие как update_date и active_users? Я бы предпочел не добавлять другой метод поверх этих, тем более что они уже такие короткие и основной вид, который наследуется, не принесет особого успеха. Во-вторых, у каждого из них есть метод post, который сохраняет шаблоны в виде CSV-файла при нажатии кнопки, и я не знаю, как его сжать, чтобы все кнопки по-прежнему функционировали должным образом. Наконец, все они имеют разные шаблоны. Должен ли я также объединить их в один файл? Это то, что я надеюсь сделать в конце концов.

1 Ответ

2 голосов
/ 30 мая 2019

Я не уверен, что вы имеете в виду, когда «пропускаете некоторые переменные через контекст», но наследование, безусловно, является подходящим способом.

Обратите внимание, что даже внутри каждого представления у вас есть некоторое дублирование, например, получение объектов Info, которые можно абстрагировать в отдельный метод.Также обратите внимание, что вы можете избежать определения dispatch просто для его украшения, если вместо этого вы добавите django.contrib.auth.mixins.UserPassesTestMixin и определите test_func.

class Intents(UserPassesTestMixin, TemplateView):

    def test_func(self):
        return self.request.user.is_staff

    def get_template_names(self):
         return 'admin/hr/intent_forms/{}_intents.html'.format(self.season_name)

    def get_info_items(self):
        update_date = get_update_date()
        active_users = get_active_users(self)
        return self.info_model.objects.filter(employee__in=active_users, date_modified__gte=update_date.date, active=True).order_by('position','employee__last_name')

    def get_context_data(self, **kwargs):
        kwargs['{}_info'.format(self.season_name)] = self.get_info_items()
        return super().get_context_data(**kwargs)

    def post(self, request, *args, **kwargs):
        file_name = "{}_intent_forms".format(self.season_name)
        info = self.get_info_items()
        student_intents = get_student_intents(active_users, update_date, self.season_name, info)

        return intents_to_csv(student_intents, file_name)

class SummerIntents(Intents):
    season_name = 'summer'
    info_model = SummerInfo

class WinterIntents(Intents):
    season_name = 'winter'
    info_model = WinterInfo

class FallIntents(Intents):
    season_name = 'fall'
    info_model = FallInfo

(Кроме того, это немного странноиметь get_active_users в качестве служебного метода, который принимает класс представления в качестве параметра. Вы уверены, что это не должен быть метод в представлении?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...