Как добавить запрещенных пользователей в таблицу и отправить подробности на электронную почту пользователя в Django Admin - PullRequest
0 голосов
/ 10 мая 2018

У меня есть простая функция запрета, которая устанавливает для активного пользователя значение false, и базовая функция отправки электронной почты для отправки электронных писем. Таблицы, с которыми я работаю: User, Profile, Report & Banned_User Таблица.

Я ищу:

  1. добавьте пользователя Profile, Reason_reported из таблицы Report и datetime, чтобы они были заблокированы в таблице Banned_User после запрета.
  2. отправить эти данные на электронную почту пользователей

В настоящее время я получаю 'Attribute Error at /admin/api/profile/: WSGIRequest' object has no attribute 'report'' и не уверен, как делать эти две вещи.

def banning_users(self, request, queryset):

for obj in queryset:
    if hasattr(obj, 'user'):
        # This object is a Profile, so lookup the user
        obj = obj.user
    obj.is_active = False

    #email function
    banned_user = Banned_User.objects.create(profile=request.user.profile, report_reasons=request.report.report_reason)
    banned_user.save()
    #Sends ban email to user,does not send through the variables yet
    subject = 'Ban'
    message =   'You have been banned'
    email_from = settings.EMAIL_HOST_USER
    recipient_list = [obj.email]
    send_mail( subject, message,email_from, recipient_list )
    obj.save()


self.message_user(request, "User is banned and Email has been sent")

Таблицы ниже:

Таблица отчетов

class Report(models.Model):
def __str__(self):
    return str.join(str(self.user_reported), str(self.datetime_sent))

TOXICITY = 'Toxicity'
SPORTSMANSHIP = 'Poor sportsmanship'

REPORT_REASON_CHOICES = (
    (TOXICITY, 'Toxicity'),
    (SPORTSMANSHIP, 'Unsportsmanlike Behaviour'),
)

session = models.ForeignKey(
    'Session',
    on_delete=models.PROTECT,
    blank=False,
    null=False,
)

user_reported = models.ForeignKey(
    'Profile',
    on_delete=models.PROTECT,
    blank=False,
    null=False,
    related_name='user_reported_report',
)

sent_by = models.ForeignKey(
    'Profile',
    on_delete=models.PROTECT,
    blank=False,
    null=False,
    related_name='sent_by_report',
)

report_reason = models.CharField(
    max_length=255,
    choices=REPORT_REASON_CHOICES,
    default=TOXICITY,
)

datetime_sent = models.DateTimeField(auto_now_add=True,)

Таблица заблокированных пользователей

class Banned_User(models.Model):
def __str__(self):
    return self.user.get_username

profile = models.ForeignKey(
    'Profile',
    on_delete=models.PROTECT,
    blank=False,
    null=False,
    related_name='banned_profile'
)

report_reason = models.ForeignKey(
    'Report',
    on_delete=models.PROTECT,
    blank=True,
    null=True,
)

date_banned = models.DateField(null=True, blank=False,)

ПРОФИЛЬ:

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.PROTECT)

def __str__(self):
    return self.user.username

USWEST = 'US-West'
USEAST = 'US-East'
EUROPE = 'Europe'
OCEANIA = 'Oceania'
ASIA = 'Asia'
SOUTHAMERICA = 'South America'
SOUTHAFRICA = 'South Africa'
MIDDLEEAST = 'Middle-East'

PREF_SERVER_CHOICES = (
    (USWEST, 'US-West'),
    (USEAST, 'US-East'),
    (EUROPE, 'Europe'),
    (OCEANIA, 'Oceania'),
    (ASIA, 'Asia'),
    (SOUTHAMERICA, 'South America'),
    (SOUTHAFRICA, 'South Africa'),
    (MIDDLEEAST, 'Middle-East'),
)

pref_server = models.CharField(
    max_length=20,
    choices=PREF_SERVER_CHOICES,
    default=USWEST,
)

TEAMWORK = 'Teamwork'
COMMUNICATION = 'Communication'
SKILL = 'Skill'
SPORTSMANSHIP = 'Sportsmanship'

COMMENDS_CHOICES = (
    (TEAMWORK, 'Teamwork'),
    (COMMUNICATION, 'Communication'),
    (SKILL, 'Skill'),
    (SPORTSMANSHIP, 'Sportsmanship'),
)
teamwork_commends = models.IntegerField(null=False, blank=False, default='0',)
communication_commends = models.IntegerField(null=False, blank=False, default='0',)
skill_commends = models.IntegerField(null=False, blank=False, default='0',)
sportsmanship_commends = models.IntegerField(null=False, blank=False, default='0',)

# Weighting of commends
commend_priority_1 = models.CharField(null=False, blank=False, max_length=20, default=TEAMWORK, choices=COMMENDS_CHOICES,)
commend_priority_2 = models.CharField(null=False, blank=False, max_length=20, default=COMMUNICATION, choices=COMMENDS_CHOICES,)
commend_priority_3 = models.CharField(null=False, blank=False, max_length=20, default=SKILL, choices=COMMENDS_CHOICES,)
commend_priority_4 = models.CharField(null=False, blank=False, max_length=20, default=SPORTSMANSHIP, choices=COMMENDS_CHOICES,)

# Other details
birth_date = models.DateField(null=True, blank=False,)
sessions_played = models.IntegerField(null=False, blank=False, default=0,)
received_ratings = models.IntegerField(null=False, blank=False, default=0,)
in_queue = models.BooleanField(null=False, blank=False, default=False,)

# The users id on discord, which will never change. Current max length is 19, but set to 20 for safe measure (64bit Integer)
discord_id = models.CharField(max_length=20, null=True, blank=True,)

след вызовов TRACEBACK:

AttributeError at /admin/api/profile/

'WSGIRequest' object has no attribute 'report'

Request Method:     POST
Request URL:    http://127.0.0.1/admin/api/profile/
Django Version:     2.0.5
Exception Type:     AttributeError
Exception Value:    

'WSGIRequest' object has no attribute 'report'

Exception Location:     /home/mihir/Capstone-Project/siteroot/apps/api/admin.py in banning_users, line 31
Python Executable:  /usr/bin/python3.6
Python Version:     3.6.5
Python Path:    

['/home/mihir/Capstone-Project/siteroot',
 '/usr/lib/python36.zip',
 '/usr/lib/python3.6',
 '/usr/lib/python3.6/lib-dynload',
 '/usr/local/lib/python3.6/dist-packages',
 '/usr/lib/python3/dist-packages',
 '/var/www/CapstoneProject/siteroot',
 '/var/www/CapstoneProject/siteroot/mysite']

Server time:    Thu, 10 May 2018 03:36:51 +0000

новый код:

    def banning_users(self, request, queryset):

    for obj in queryset:
        if hasattr(obj, 'user'):
            # This object is a Profile, so lookup the user
            obj = obj.user
        obj.is_active = False

        banned_user = Banned_User.objects.create(profile=request.user.profile)
        banned_user.report_reason.add(request.user.profile.user_reported_report.all())
        banned_user.save()
        #Sends ban email to user,does not send through the variables yet
        subject = 'Ban'
        message =   'You have been banned for being trash'
        email_from = settings.EMAIL_HOST_USER
        recipient_list = [obj.email]
        send_mail( subject, message,email_from, recipient_list )
        obj.save()

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Я ищу:

  1. добавить профиль пользователя, Reason_reported из таблицы отчетов и дату и время, когда они были забанены в таблицу Banned_User после того, как забанены.

  2. отправьте эти данные на электронную почту пользователей

Чтобы сократить вопрос до реальной проблемы, сначала нужно создать отчет о запрете, а затем добавитьи, наконец, отправьте электронное письмо.

В сообщении об ошибке сообщается, что для объекта request нет атрибута report, что имеет смысл, поскольку отчет привязан к пользователю, а не к запросу.

def banning_users(self, request, queryset):

    for obj in queryset:
        if hasattr(obj, 'user'):
            # This object is a Profile, so lookup the user
            profile = obj
            user = obj.user
        user.is_active = False

        # Get the report(s) for this user
        user_reports = Report.objects.filter(user_reported=profile)

        # Go through each report, in case there are multiples,
        # add a record in the ban table

        banned_reasons = []

        for report in user_reports:
            ban_record = Banned_User.create(profile=profile, report_reason=report, date_banned=datetime.datetime.today())
            banned_reasons.append(report.get_report_reason_display())

        # Send the email
        subject = 'Ban'
        message = 'You have been banned for the following reasons: {}'
        message.format(','.join(banned_reasons))
        email_from = settings.EMAIL_HOST_USER
        recipient_list = [user.email]
        send_mail( subject, message,email_from, recipient_list)

    self.message_user(request, "User is banned and Email has been sent")
0 голосов
/ 16 мая 2018
This is the code that finally got it working :) thanks everyone for the help


def banning_users(self, request, queryset):

for obj in queryset:
    if hasattr(obj, 'user'):
        # This object is a Profile, so lookup the user
        profile = obj
        user = obj.user
    user.is_active = False
    user.save()

    banned_reasons = []


    banned_user = profile.banned_profile.create(profile=profile)
    reports = banned_user.profile.user_reported_report.all()
    banned_user.save()
    for report in reports:
        banned_user.report_reason.add(report)

    # Send the email
    subject = 'Ban'
    message = 'You have been banned for the following reasons: []'
    email_from = settings.EMAIL_HOST_USER
    recipient_list = [user.email]
    send_mail( subject, message,email_from, recipient_list)

self.message_user(request, "User is banned and Email has been sent")
0 голосов
/ 10 мая 2018

Проблема исходит из этой строки:

banned_user = Banned_User.objects.create(profile=request.user.profile, 
           report_reasons=request.report.report_reason)

Вы пытаетесь получить доступ к отчету внутри запроса, тогда как запрос не имеет этого атрибута.

Я предлагаю изменить ForeignKey на ManyToManyField, поскольку у пользователя может быть несколько отчетов.

class Banned_User(models.Model):
    def __str__(self):
        return self.user.get_username

    profile = models.ForeignKey('Profile',on_delete=models.PROTECT,
         blank=False, null=False, related_name='banned_profile',)

    report_reasons = models.ManyToManyField('Report',blank=True)

Итак, вы бы получили это:

if hasattr(obj, 'user'):
    # This object is a Profile, so lookup the user
    obj = obj.user
obj.is_active = False

# email function
banned_user = Banned_User.objects.create(profile=request.user.profile)
banned_user.report_reasons.add(request.user.profile.user_reported_report.all())
# rest of code 
...