Как я могу вызвать функцию и сформировать возвращаемый объект для использования в моем файле настроек? - PullRequest
0 голосов
/ 07 января 2011

У меня есть промежуточное программное обеспечение, которое принимает кортеж (из имен пользователей ... он позволяет только именам в кортеже проходить через определенные области сайта).

У меня есть модель UserProfile, которая содержит информацию о каждом пользователе, и я хочу отфильтровать ее так, чтобы она возвращала кортеж имен пользователей для использования с этим промежуточным ПО - другими словами, установите переменную BETA_USERS = (динамически генерируемый кортеж ).

Есть ли у вас какие-либо предложения для достижения этой цели?

Edit:

Итак, кортеж на самом деле не важная деталь - вот пример:

Как правило, я бы просто запрограммировал это в настройках:

BETA_USERS = ('username1', 'username2', 'username3', 'username4')

Тем не менее, у меня есть модель UserProfile, которая содержит столбец Beta, который может быть установлен в 1. Первые 50 человек, которые подпишутся на бета-версию, будут установлены в 1, все остальные 0. Таким образом, я могу легко отфильтровать это вызвав метод фильтра для объекта модели:

users = UserProfile.objects.filter(beta='1')

и я могу сделать хороший кортеж с этим странным маленьким циклом:

for user in users:
    list.append((user.user.username).upper())
return tuple(list)

Полагаю, мой настоящий вопрос в том, как мне лучше всего позвонить в моем файле настроек?

или, иначе говоря, каков наилучший способ назначения динамически создаваемых переменных в файле настроек?

Ответы [ 4 ]

2 голосов
/ 07 января 2011

Вы также можете использовать декоратор @user_passes_test, чтобы ограничить представления для определенных подмножеств пользователей. Или создайте свой собственный декоратор:

from django.utils.functional import wraps

def beta(view):
    @wraps(view)
    def inner(request, *args, **kwargs):
        if request.user.user_profile.beta:
            return view(request, *args, **kwargs)
        # Up to you how you return failure...
    return inner

Теперь вы можете использовать его как:

@beta
def my_view(request):
    # do something new here.

Альтернатива:

@user_passes_test(lambda u: u.profile.beta)
def my_view(request):
    # do something clever

Преимущество формы @beta в том, что ее немного проще использовать повторно.

0 голосов
/ 07 января 2011

Первое, что приходит на ум, - это создать список, затем вызвать tuple () или создать кортеж на лету, используя функцию генератора, выдающую каждое имя пользователя. В любом случае вам нужно будет создать интерфейс для ваших данных. Я просмотрел этот сайт и, похоже, к вашим данным лучше всего обращаться через интерфейс, обращающийся к глобальному объекту объекта. Просто итерируйте ваши объекты django.model и извлеките ваше имя пользователя, каждый раз уступая генератору, используемому для создания кортежа.

0 голосов
/ 07 января 2011

У Тима хороший ответ, если вы хотите продолжать делать то же, что и сейчас.

Но django предоставляет хороший способ, позволяющий только некоторым людям входить в области сайта, с помощью пользовательских разрешений .

Вы должны реализовать их и украсить виды, требующие разрешения, с помощью @permission_required

0 голосов
/ 07 января 2011

Я не уверен, правильно ли я понимаю вашу проблему.Это как-то так?

>>> allowed_users = ("John", "Eric", "Graham", "Terry")
>>> current_users = ("Connie", "John", "Ian", "Terry")
>>> tuple(user for user in current_users if user in allowed_users)
('John', 'Terry')

Лучшее решение (спасибо Сухбиру за напоминание!):

>>> set(allowed_users) & set(current_users)
{'John', 'Terry'}

или, если результат должен быть кортежем:

>>> tuple(set(allowed_users) & set(current_users))
('John', 'Terry')

Единственным недостатком при использовании набора является то, что порядок не обязательно будет сохранен.

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