@gorodetskiykp
горе-программист

Как сделать календарный план на Django?

Есть задача - создать приложение "Календарный план" на Django.

Получилась такая модель:
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
import mptt

class Schedule(models.Model):
    title = models.TextField(verbose_name='Название графика', default='План-график', null=False, blank=False)
    contract = models.ForeignKey('contracts.Contract', verbose_name='Договор', default='', blank=True, null=True, related_name='schedules')
    system = models.ForeignKey('isystems.iSystem', verbose_name='Система', default='', blank=True, null=True, related_name='schedules')
    link = models.URLField(verbose_name='Ссылка на скан', blank=True, null=True)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ['system']
        verbose_name = 'План-график'
        verbose_name_plural = 'План-графики'

class Step(MPTTModel):
    schedule = models.ForeignKey('Schedule', verbose_name='План-график', blank=False, null=False, related_name='steps')
    step_num = models.PositiveSmallIntegerField(verbose_name='Номер этапа', default='', null=True, blank=True)
    title = models.TextField(verbose_name='Этап', default='', null=False, blank=False)
    date_begin = models.DateField(verbose_name='Дата начала', null=True, blank=True)
    date_end = models.DateField(verbose_name='Дата завершения', null=True, blank=True)
    org_executors = models.ManyToManyField('organizations.Organization', verbose_name='Исполнители', blank=True)
    man_executors = models.ManyToManyField('people.People', verbose_name='Исполнители', blank=True)
    parent = TreeForeignKey('self', verbose_name='Родительский этап', null=True, blank=True, related_name='children', db_index=True)
    done = models.BooleanField(verbose_name='Этап завершен', default=False)
    report = models.TextField(verbose_name='Результат этапа', default='', null=True, blank=True)
    
    def __str__(self):
        return '{}. {}'.format(self.step_num, self.title)

    class Meta:
        ordering = ['date_begin']
        verbose_name = 'Этап'
        verbose_name_plural = 'Этапы'
        
    class MPTTMeta:
        order_insertion_by = ['schedule']

mptt.register(Step, )


Вопросы:
1. Правильно ли организована модель? Может, есть уже готовые, проверенные шаблоны?
2. Как выводить план-график в html? Использую следующую конструкцию:
{% load mptt_tags %}
<ul>
    {% recursetree schedule.steps.all %}
        <li>
            {{ node.parent.step_num}}. {{ node.step_num }} - {{ node.title }}
            {% if not node.is_leaf_node %}
                <ul class="children">
                    {{ children }}
                </ul>
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>

Получаю в итоге нумерацию "родитель"."нода". Как получить полную нумерацию, если уровень иерархии больше 2? - это решил!
вместо:  {{ node.parent.step_num}}. {{ node.step_num }} - {{ node.title }}
сделал так: {% for parent_node in node.get_ancestors %}{{ parent_node.step_num }}.{% endfor %}{{ node.step_num }} - {{ node.title }}

3. Как в админке ограничивать выбор родительского этапа только этапами текущего плана-графика?
4. Вывожу список всех планов следующим способом:
<tbody>
{% for chart in schedules %}
<tr>
    <td><a href="{% url 'schedule_charts:detail' chart.id %}">{{ chart.title }}</a></td>
    <td>{% if chart.system %}<a href="{% url 'isystems:detail' chart.system.id %}">{{ chart.system }}</a>{% endif %}</td>
    <td>{% if chart.contract %}<a href="{% url 'contracts:detail' chart.contract.id %}">{{ chart.contract.sed_number }} от {{ chart.contract.reg_date }}</a>{% endif %}</td>
</tr>
{% endfor %}
</tbody>

Как добавить поля "Самая ранняя дата в календарном плане" и "Самая поздняя дата.."?

views.py
class ScheduleList(ListView):
    model = Schedule

    def get_context_data(self, **kwargs):
        context = super(ScheduleList, self).get_context_data(**kwargs)
        context['schedules'] = Schedule.objects.all()
        return context

class ScheduleInfo(DetailView):
    model = Schedule
    context_object_name = 'schedule'

class StepsList(ListView):
    model = Step
    def get_context_data(self, **kwargs):
        context = super(StepsList, self).get_context_data(**kwargs)
        context['steps'] = Step.objects.all()
        return context


Спасибо!
  • Вопрос задан
  • 287 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы