0
votes

I've looked at all the related answers but none fixed my issue. I'm trying to save an object that's already created with no luck. I could see the view getting executed and the values I updated for the object but changes are not reflecting in the database. Here is the code snippet of the view and the model.

views.py

class Workspace(_LoggedInMixin, View):
    def get(self, request):
        user = self.request.user
        components = ComponentModel.objects.filter(Q(user=user) | Q(user=None)).order_by('time')
        component_status = request.session.get('component', None)
        request.session['component'] = None
        params = dict(components=components, status=component_status)
        return render(request, 'workspace.html', params)

    def post(self, request):
        data = request.POST
        formtype = data['form-type']
        error = None
        user = self.request.user
        if formtype == 'component':
            if data['action'] == 'create':
                try:
                    if not os.path.exists('D:/' + self.request.user.username):
                        os.makedirs('D:/' + self.request.user.username)
                    cparent = ComponentModel.objects.get(pk=data['cparent'])
                    component = ComponentModel(user=user, name=data['cname'], time=dt.now(), stats=data['cstats'],
                                               output=data['coutput'], parent=cparent)
                    component.save()
                    file = open('D:/' + self.request.user.username + '/' + str(component.id) + '.py', 'w+')
                    usercode = data['usercode']
                    usercode = "\n".join(usercode.split("\r\n"))
                    file.write(usercode)
                    component.codefile = 'D:/' + self.request.user.username + '/' + str(component.id) + '.py'
                    component.save()
                    request.session['component'] = {'name': data['cname'], 'message': 'Component created successfully!'}
                except Exception as e:
                    component.delete()
                    error = e.message
            elif data['action'] == 'delete':
                try:
                    c = ComponentModel.objects.get(pk=data['compid'])
                    cname = c.name
                    c.delete()
                    os.remove('D:/' + self.request.user.username + '/' + data['compid'] + '.py')
                    request.session['component'] = {'name': cname, 'message': 'Component deleted successfully!'}
                except Exception as e:
                    error = e.message
            elif data['action'] == 'save':
                try:
                    if not os.path.exists('D:/' + self.request.user.username):
                            os.makedirs('D:/' + self.request.user.username)
                    cparent = ComponentModel.objects.get(pk=data['cparent'])
                    component = ComponentModel.objects.get(pk=data['compid'])
                    component.user = user
                    component.name = data['cname']
                    component.time = dt.now()
                    component.stats = data['cstats']
                    component.output = data['coutput']
                    component.parent = cparent
                    component.save()
                    print component
                    file = open('D:/' + self.request.user.username + '/' + str(component.id) + '.py', 'w+')
                    usercode = data['usercode']
                    usercode = "\n".join(usercode.split("\r\n"))
                    file.write(usercode)
                    request.session['component'] = {'name': data['cname'], 'message': 'Component saved successfully!'}
                except Exception as e:
                    error = e.message
        if error is not None:
            components = ComponentModel.objects.filter(Q(user=user) | Q(user=None)).order_by('time')
            params = dict(error=error, components=components)
            return render(request, 'workspace.html', params)
        return redirect('/workspace')

models.py

class ComponentModel(models.Model):
    class Meta:
        # overriding the default table name with the following name
        db_table = 'components'
        verbose_name = 'components'
        get_latest_by = 'time'

    user = models.ForeignKey('auth.User', on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=255)
    time = models.DateTimeField(db_column='created_on')
    codefile = models.CharField(max_length=100, db_column='code_file_name', null=True)
    stats = models.TextField(db_column='statistical_fields', null=True)
    output = models.TextField(db_column='output_fields')
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True)

    def save(self, *args, **kwargs):
        try:
            super(ComponentModel, self).save(self, *args, **kwargs)
        except Exception as e:
            return "Something went wrong while saving the component. Details - %s" % e.message

    def __str__(self):
        return "{id: %s, name: %s, user: %s, time: %s, parent: %s}" % (
            self.id, self.name, self.user, self.time, self.parent)

The second save call in data['action'] == 'create' and the save call in data['action'] == 'save' are not updating the database. I appreciate any help. Thank you.

1
What was except Exception as e - Aviah Laor
@AviahLaor I want to catch all sort of exceptions while saving the instance. - Jo Kachikaran

1 Answers

2
votes

Your super call is incorrect. Update so that self is not called as a method argument - as you have it written it will always fail.

In addition, you are not raising the exception when a save is not completed, so you have no idea if there was an error unless viewing the std output. You probably want this to actually raise an error.

Update as such -

def save(self, *args, **kwargs):
    try:
        super(ComponentModel, self).save(*args, **kwargs)
    except Exception as e:
        raise Exception("Something went wrong while saving the component. Details - %s" % (e.message,))