Последнее посещение 4 дня, 12 часов назад

Илья Чичак

ilya_chch

  • 1
  • 0
Показать информацию

Обо мне

  • #
  • 17 ноября 2020 г. 7:46

Илья, еще раз день Вам добрый!
По поводу кода - ошибки ушли (поправил как смог), но вот код почему-то не заработал.
Может из-за того, что не может определить Usera или Group - они не проставляются почему-то...
вот мой models.py:

class Article(models.Model):
    number_at = models.CharField('Номер заказа', max_length=20, default='')
    user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='Имя Менеджера', blank=True, null=True)
    group_user = models.ForeignKey(Group, on_delete=models.PROTECT, verbose_name='Имя группы', null=True)
    created_at = models.DateTimeField('Дата создания заказа', auto_now_add=True)
    modified_at = models.DateTimeField('Дата внесения изменения', auto_now=True)
    contragent = models.CharField('Контрагент', max_length=50, blank=True, null=True)
    delivery_address = models.CharField('Адрес поставки', max_length=80, default='', blank=True, null=True)
    label = models.CharField('Наименование', max_length=50, default='', blank=True, null=True)
    packing = models.CharField('Фасовка', max_length=25, default='', blank=True, null=True)
    quantity = models.IntegerField('Количество, (кг.)', default='0', blank=False, null=True)
    palletizing = models.ForeignKey(Category, on_delete=models.PROTECT, verbose_name='Паллетирование', blank=True, null=True)
    output = models.CharField('Выгрузка', max_length=15, default='', blank=True, null=True)
    output_at = models.DateTimeField('Дата отгрузки', blank=True, null=True)
    price = models.IntegerField('Целевая цена доставки (руб.)', blank=True, null=True)
    is_signed = models.BooleanField('ДС подписано', default=False)
    delivery_type = models.CharField('Тип доставки', max_length=25, default='', blank=True, null=True)
    production_date = models.DateTimeField('Дата производства', blank=True, null=True)
    day_part = models.CharField('день или ночь', max_length=5, default='', blank=True)
    product_is_ready = models.BooleanField('Готовность продукта', default=False, blank=True, null=True)
    pack_is_ready = models.BooleanField('Готовность фасовки', default=False)
    packing_order = models.CharField('Порядок загрузки', max_length=15, default='', blank=True)
    delivery_planed_at = models.DateTimeField('Машина заказана на дату', blank=True, null=True)
    send_at = models.DateTimeField('Дата отправки факт', blank=True, null=True)
    transporter = models.CharField('Перевозчик', max_length=35, default='', blank=True)
    number_ts = models.CharField('Номер ТС', max_length=15, default='', blank=True)
    price_fact = models.IntegerField('Фактическая цена доставки (руб.)', blank=True, null=True)
    date_take = models.DateTimeField('Дата доставки', blank=True, null=True)

    def __str__(self):
        return str(self.number_at)

    class Meta:
        verbose_name = '=ЗАКАЗ='
        verbose_name_plural = '=ЗАКАЗЫ='

        permissions = (
            ('can_edit_manager_group', 'Can edit manager group of columns'),
            ('can_edit_upakovka_group', 'Can edit upakovka group of columns'),
            ('can_edit_transport_group', 'Can edit transport group of columns'),
        )

вот мой admin.py:

class ArticleAdmin(admin.ModelAdmin):
    save_on_top = True
    list_display = ('id', 'number_at', 'user', 'group_user', 'created_at', 'modified_at', 'contragent',
                    'delivery_address', 'label', 'packing', 'quantity', 'palletizing', 'output', 'output_at', 'price',
                    'is_signed', 'delivery_type', 'production_date', 'day_part', 'product_is_ready', 'pack_is_ready',
                    'packing_order', 'delivery_planed_at', 'send_at', 'transporter', 'number_ts', 'price_fact',
                    'date_take',)
    list_display_links = ('id', 'number_at', 'contragent', 'delivery_address', 'quantity')

    fields = ('number_at', 'user', 'group_user', 'contragent', 'delivery_address',
              'label', 'packing', 'quantity', 'palletizing', 'output', 'output_at', 'price', 'is_signed',
              'delivery_type', 'production_date', 'day_part', 'product_is_ready', 'pack_is_ready', 'packing_order',
              'delivery_planed_at', 'send_at', 'transporter', 'number_ts', 'price_fact', 'date_take',)
    readonly_fields = ('number_at', 'contragent', 'delivery_address',
                       'label', 'packing', 'quantity', 'output', 'output_at', 'price', 'is_signed',
                       'delivery_type', 'production_date', 'day_part', 'product_is_ready', 'pack_is_ready',
                       'packing_order',
                       'delivery_planed_at', 'send_at', 'transporter', 'number_ts', 'price_fact', 'date_take',)

    manager_group_fields = ('number_at', 'user', 'group_user', 'contragent',
                            'delivery_address', 'label', 'packing', 'quantity', 'palletizing', 'output',
                            'output_at', 'price', 'is_signed', 'delivery_type')
    upakovka_group_fields = ('production_date', 'day_part', 'product_is_ready')
    transport_group_fields = ('pack_is_ready', 'packing_order', 'delivery_planed_at', 'send_at',
                              'transporter', 'number_ts', 'price_fact', 'date_take')

    def get_readonly_fields(self, request, obj=None):
        base_readonly_fields = super().get_readonly_fields(request, obj)
        if request.user.has_perm('can_edit_manager_group'):
            self.fields = [f for f in base_readonly_fields if f in self.manager_group_fields]
        elif request.user.has_perm('can_edit_upakovka_group'):
            self.fields = [f for f in base_readonly_fields if f in self.upakovka_group_fields]
        elif request.user.has_perm('can_edit_transport_group'):
            self.fields = [f for f in base_readonly_fields if f in self.transport_group_fields]
        return self.fields


admin.site.register(Article, ArticleAdmin)

Даже и не знаю, что не так...
Просто у Админа все для чтения и у юзеров все для чтения.
Все права по группам распределил, всех юзеров разнес тоже по группам.
Но вот не работает.
Уж извините.

  • #
  • 16 ноября 2020 г. 8:57

...возможно добавление self. перед fields решает проблему, НО если так подставить, то ни каких изменений не происходит.
поля по readonly_fields никому недоступны на редактирование, ни юзерам, ни админу...

  • #
  • 16 ноября 2020 г. 8:44

Илья, доброго Вам дня!
Прошу прощения, что обращаюсь опять со своими вопросами...
Попробовал я все, что вы мне посоветовали.
Все переименовал, миграции сделал, появились пермишены как вы и говорили, но вот от разных ошибок я избавился (те которые были по недосмотру моему), но вот появилась такая ошибка и я ни как не могу найти ответов в инете по ее устранению:
UnboundLocalError: local variable 'fields' referenced before assignment

мой models.py:

class Article(models.Model):
    number_at = models.CharField('Номер заказа', max_length=20, default='')
    user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='Имя Менеджера', blank=True, null=True)
    group_user = models.ForeignKey(Group, on_delete=models.PROTECT, verbose_name='Имя группы', null=True)
    created_at = models.DateTimeField('Дата создания заказа', auto_now_add=True)
    modified_at = models.DateTimeField('Дата внесения изменения', auto_now=True)
    contragent = models.CharField('Контрагент', max_length=50)
    delivery_address = models.CharField('Адрес поставки', max_length=80, default='')
    label = models.CharField('Наименование', max_length=50, default='')
    packing = models.CharField('Фасовка', max_length=25, default='')
    quantity = models.IntegerField('Количество, (кг.)', default='0', blank=False, null=True)
    #palletizing = models.ForeignKey('Category', on_delete=models.PROTECT, max_length=3, blank=True, null=True)
    output = models.CharField('Выгрузка', max_length=15, default='')
    output_at = models.DateTimeField('Дата отгрузки', blank=True, null=True)
    price = models.IntegerField('Целевая цена доставки (руб.)', blank=True, null=True)
    is_signed = models.BooleanField('ДС подписано', default=False)
    delivery_type = models.CharField('Тип доставки', max_length=25, default='')
    production_date = models.DateTimeField('Дата производства', blank=True, null=True)
    day_part = models.CharField('день или ночь', max_length=5, default='', blank=True)
    product_is_ready = models.BooleanField('Готовность продукта', default=False, blank=True, null=True)
    pack_is_ready = models.BooleanField('Готовность фасовки', default=False)
    packing_order = models.CharField('Порядок загрузки', max_length=15, default='', blank=True)
    delivery_planed_at = models.DateTimeField('Машина заказана на дату', blank=True, null=True)
    send_at = models.DateTimeField('Дата отправки факт', blank=True, null=True)
    transporter = models.CharField('Перевозчик', max_length=35, default='', blank=True)
    number_ts = models.CharField('Номер ТС', max_length=15, default='', blank=True)
    price_fact = models.IntegerField('Фактическая цена доставки (руб.)', blank=True, null=True)
    date_take = models.DateTimeField('Дата доставки', blank=True, null=True)

    def __str__(self):
        return str(self.number_at)

    class Meta:
        verbose_name = '=ЗАКАЗ='
        verbose_name_plural = '=ЗАКАЗЫ='

        permissions = (
            ('can_edit_manager_group', 'Can edit manager group of columns'),
            ('can_edit_upakovka_group', 'Can edit upakovka group of columns'),
            ('can_edit_transport_group', 'Can edit transport group of columns'),
        )

мой admin.py:

class ArticleAdmin(admin.ModelAdmin):
    save_on_top = True
    list_display = ('id', 'number_at', 'user', 'group_user', 'created_at', 'modified_at', 'contragent',
                    'delivery_address', 'label', 'packing', 'quantity', 'output', 'output_at', 'price',
                    'is_signed', 'delivery_type', 'production_date', 'day_part', 'product_is_ready', 'pack_is_ready',
                    'packing_order', 'delivery_planed_at', 'send_at', 'transporter', 'number_ts', 'price_fact',
                    'date_take',)
    list_display_links = ('number_at', 'contragent', 'delivery_address')
    manager_group_fields = ('number_at', 'user', 'group_user', 'contragent',
                            'delivery_address', 'label', 'packing', 'quantity', 'output',
                            'output_at', 'price', 'is_signed', 'delivery_type')
    upakovka_group_fields = ('production_date', 'day_part', 'product_is_ready')
    transport_group_fields = ('pack_is_ready', 'packing_order', 'delivery_planed_at', 'send_at',
                              'transporter', 'number_ts', 'price_fact', 'date_take')

    fields = ('number_at', 'user', 'group_user', 'contragent', 'delivery_address',
              'label', 'packing', 'quantity', 'output', 'output_at', 'price', 'is_signed',
              'delivery_type', 'production_date', 'day_part', 'product_is_ready', 'pack_is_ready', 'packing_order',
              'delivery_planed_at', 'send_at', 'transporter', 'number_ts', 'price_fact', 'date_take',)
    readonly_fields = fields

    def get_readonly_fields(self, request, obj=None):
        base_readonly_fields = super().get_readonly_fields(request, obj)
        if request.user.has_perm('can_edit_manager_group'):
            fields = [f for f in base_readonly_fields if f in self.manager_group_fields]
        elif request.user.has_perm('can_edit_upakovka_group'):
            fields = [f for f in base_readonly_fields if f in self.upakovka_group_fields]
        elif request.user.has_perm('can_edit_transport_group'):
            fields = [f for f in base_readonly_fields if f in self.transport_group_fields]
        return fields


admin.site.register(Article, ArticleAdmin)

Еще и Pycharm подсвечивает 'fields' в строке 'return fields' но не критично, хотя думаю, что в этом тоже есть причина.
Пишет - 'Add global statement'.

Уделите мне, балбесу немного времени. Помогите решить вопрос!
Заранее благодарен!

  • #
  • 14 ноября 2020 г. 6:00

Илья, ЗДРАВСТВУЙТЕ!
Вы подтверждаете истину, что мир не без добрых людей и вы среди них один из первых!
ОРГОМНОЕ ВАМ СПАСИБО!
Ранее я тоже смотрел на это решение через добавление прав, но почему-то оно паказалось мне неспособным решить мою задачу. Видимо по моему малому знанию самого предмета изучения.
Спасибо ВАМ еще раз!
У меня вопрос к ВАМ по поводу метода:
- first_group_fields = ('...', '...', '...') - тут прописывать именно те столбцы которые должны быить видны той группе которая должна их редактировать?

Обязательно восспользуюсь Вашим советом по переименованию столбцов - действительно просто их пронумеровать это путано и неудобно!
Сейчас не у того компа на котором сама программа и не могу попробовать вами предложенный код в работе.
Но в понедельник надеюсь сделаю, исправлю и пришлю отзыв!
Вы мне очень помогли! Сам бы я до такого ОЧЕНЬ долго доходил!

Загрузить ещё
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг