Search code examples
pythondjangodjango-modelsdjango-admindjango-email

How to add Banned Users to table,and send details to user's email within Django Admin


I have a simple banning function that sets user active to false and a basic emailing function to send emails. The tables I am working with are User,Profile,Report & Banned_User Table.

I am looking to:

  1. add the user Profile,Reason_reported from Report table and datetime that they were banned into the Banned_User table once banned.
  2. send these details to the users email

Currently I am recieving a 'Attribute Error at /admin/api/profile/: WSGIRequest' object has no attribute 'report'' and not sure how to go about doing these 2 things.

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")

Tables are below:

Report Table

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,)

Banned User Table

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,)

PROFILE:

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

new code:

    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()

Solution

  • 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")