Last visit 1 week, 3 days ago

Il'ja Chichak

ilya_chch

  • 2
  • 0
Show information

About myself

Илья, еще раз день Вам добрый!
По поводу кода - ошибки ушли (поправил как смог), но вот код почему-то не заработал.
Может из-за того, что не может определить 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)

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

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

Илья, доброго Вам дня!
Прошу прощения, что обращаюсь опять со своими вопросами...
Попробовал я все, что вы мне посоветовали.
Все переименовал, миграции сделал, появились пермишены как вы и говорили, но вот от разных ошибок я избавился (те которые были по недосмотру моему), но вот появилась такая ошибка и я ни как не могу найти ответов в инете по ее устранению:
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'.

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

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

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

Load more
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting