0

I am new in django and i have a project based on django 1.6.X and i want to upgrade it to 1.11.X to add some features but when i did it i found many problems and i solved some of them but this one i don't know what to do with it, it gives me when i run it:

RuntimeError: Conflicting 'userprofile_roles' models in application 'survey': <class 'survey.models.UserProfile_roles'> and <class 'survey.models.Userprofile_Roles'>.

Full error_log:

Unhandled exception in thread started by <function wrapper at 0x7f2b1a21b140>
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/utils/autoreload.py", line 227, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/core/management/commands/runserver.py", line 117, in inner_run
    autoreload.raise_last_exception()
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/utils/autoreload.py", line 250, in raise_last_exception
    six.reraise(*_exception)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/utils/autoreload.py", line 227, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/apps/registry.py", line 108, in populate
    app_config.import_models()
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/media/ahmed-mohamed/My Stuff/Work/AgileEngage.Sample/survey/models.py", line 255, in <module>
    class Userprofile_Roles(models.Model):    
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/db/models/base.py", line 325, in __new__
    new_class._meta.apps.register_model(new_class._meta.app_label, new_class)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.3-py2.7.egg/django/apps/registry.py", line 224, in register_model
    (model_name, app_label, app_models[model_name], model))
RuntimeError: Conflicting 'userprofile_roles' models in application 'survey': <class 'survey.models.UserProfile_roles'> and <class 'survey.models.Userprofile_Roles'>.

Can any one help me with it ? thanks alot.

Edit:

this is survey/models.py

from django.db import models
from stripogram import html2text
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.core import serializers
from datetime import datetime

class AnswerRange(models.Model):
    title = models.CharField(max_length=200)
    order = models.IntegerField(default=0)

    def answers(self):
        result = ""
        for i in self.mcqanswer_set.all():
            result += "," + i.title
        return result[1:]

    def __unicode__(self):
        return self.title + '( ' + self.answers() + ' )'

    def extar_mcq(self):
        return serializers.serialize('python', self.mcqanswer_set.all())





class McqAnswer(models.Model):
    answerrange = models.ForeignKey(AnswerRange)
    title = models.CharField(max_length=200)
    minValue = models.FloatField()
    maxValue = models.FloatField()
    def __unicode__(self):
        return self.title

class Role(models.Model):
    code = models.CharField(max_length=10)
    title = models.CharField(max_length=200)
    description = models.TextField()
    rank=models.IntegerField(default=1)



    def __unicode__(self):
        return '[ %s ] %s ' % (self.code, self.title)

ANSWER_RANGE_DISPLAY_CHOICES = (
    ('sequence', 'sequence'),
    ('reverse', 'reverse'),
    ('random', 'random'),
)
ACTIVE_CHOICES = (
    ('include', 'No'),
    ('exclude', 'Yes'),
)
class Indicator(models.Model):
    code = models.CharField(max_length=10)
    roles = models.ManyToManyField(Role)
    question = models.TextField()
    answer_range = models.ForeignKey(AnswerRange)
    answer_range_display = models.CharField(max_length=8, choices=ANSWER_RANGE_DISPLAY_CHOICES, default='sequence')
    answers = models.ManyToManyField(User, through='Answer')
    exclude = models.CharField(max_length=8, choices=ACTIVE_CHOICES, default='include')

    def text(self):
        return html2text(self.question)

    def __unicode__(self):
        return '[ %s ] %s ' % (self.code, self.question)

class CharacteristicCategory(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()   
    def __unicode__(self):
        return self.title


class Characteristic(models.Model):
    code = models.CharField(max_length=10)
    title = models.CharField(max_length=200)
    description = models.TextField()
    characteristic_category = models.ForeignKey(CharacteristicCategory, null=True, blank=True)
    indicators = models.ManyToManyField(Indicator)

    def __unicode__(self):
        return '[ %s ] %s ' % (self.code, self.title)


class Practice(models.Model):
    code = models.CharField(max_length=10)
    title = models.CharField(max_length=200)
    description = models.TextField()
    characteristics = models.ManyToManyField(Characteristic)

    def __unicode__(self):
        return '[ %s ] %s ' % (self.code, self.title)


class Answer(models.Model):
    indicator = models.ForeignKey(Indicator)
    user = models.ForeignKey(User)
    mcqanswer = models.ForeignKey(McqAnswer)


class Macro(models.Model):
    place_holder = models.CharField(max_length=255)
    translation = models.TextField()

    def __unicode__(self):
        return '%s -> %s' % (self.place_holder ,self.translation) 

class ReportPassword(models.Model):
    url = models.CharField(max_length=400)
    password = models.CharField(max_length=20)

    def __unicode__(self):
        return self.url  

class Demographic(models.Model):
    title = models.CharField(max_length=200)
    required = models.BooleanField()
    viewable = models.BooleanField()
    def __unicode__(self):
        return self.title

class DemographicValue(models.Model):
    demographic = models.ForeignKey(Demographic)
    value = models.CharField(max_length=200)

    def __unicode__(self):
        return self.value




class UserProfile(models.Model):
    user = models.OneToOneField(User)
    first_name = models.CharField(max_length=80)
    last_name = models.CharField(max_length=80)
    roles = models.ManyToManyField(Role, null=True, blank=True)
    supervisor= models.CharField(max_length=80)
    department_manager= models.CharField(max_length=80)
    demographics = models.ManyToManyField(Demographic, through='UserDemographics')
    hide_welcome_message = models.BooleanField()
    did_fill_demographics = models.BooleanField()
    survey_finished = models.BooleanField()




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



class Option(models.Model):    
    key = models.CharField(max_length=80)
    value = models.CharField(max_length=80)
    def __unicode__(self):
        return self.key



def isValidSurveyOption(key,value):
    try:
        option=Option.objects.get(key=key)
    except Exception:
        option = None

    if option is not None:
        if(option.value== value):
            return True

    return False


def addSurveyOptionIfNotExist(key,value):
   try:
        option=Option.objects.get(key=key)
   except Exception:
        option = None
   if option is not None:
        option.value= value
        option.save()
   else:
       Option.objects.create(key=key,value=value)   

def create_user_profile(sender, **kwargs):
    """When creating a new user, make a profile for him or her."""
    u = kwargs["instance"]
    if not UserProfile.objects.filter(user=u):
        UserProfile(user=u).save()

post_save.connect(create_user_profile, sender=User)

class UserDemographics(models.Model):
    userProfile = models.ForeignKey(UserProfile)
    demographic = models.ForeignKey(Demographic)
    demographic_value = models.ForeignKey(DemographicValue)

class Message(models.Model):
    code = models.CharField(max_length=40)
    body = models.TextField(max_length=1500)

    def __unicode__(self):
        return '%s -> %s' % (self.code ,self.body) 

class InstanceSetting(models.Model):
    code = models.CharField(max_length=100)
    value = models.TextField()

    def __unicode__(self):
        return '%s -> %s' % (self.code ,self.value) 

class Comment(models.Model):
    user = models.ForeignKey(User)
    text = models.TextField()

    def __unicode__(self):
        return self.text[:50]


class Test(models.Model):
    code = models.CharField(max_length=40)
    value=models.IntegerField(default=1)


class UsersWaitingList(models.Model):
    first_name = models.CharField(max_length=80)
    last_name = models.CharField(max_length=80)
    email= models.CharField(max_length=80)
    role = models.CharField(max_length=80)
    supervisor= models.CharField(max_length=80)
    department_manager= models.CharField(max_length=80)
    def __unicode__(self):
        return self.email


class ticket(models.Model):
    code=models.TextField()
    type=models.TextField()
    data=models.TextField()
    status=models.TextField()
    date_created = models.DateTimeField()
    date_modified = models.DateTimeField()

    def save(self, *args, **kwargs):
        if self.date_created == None:
            self.date_created = datetime.now()
        self.date_modified = datetime.now()
        super(ticket, self).save(*args, **kwargs) 



class Userprofile_Roles(models.Model):    
    role = models.ForeignKey(Role)
    userprofile = models.ForeignKey(UserProfile)
    def __unicode__(self):
        return self.userprofile.first_name
Ahmed Mohamed
  • 231
  • 4
  • 15
  • ok, see the edit in the post , thanks @Alasdair – Ahmed Mohamed Jul 26 '17 at 12:21
  • Upgrading from Django 1.6 to 1.11 is a huge jump. You may find it easier to upgrade to 1.7.x, then to 1.8 LTS. Finally, the upgrade from 1.8 LTS to 1.11 LTS should be easier. – Alasdair Jul 26 '17 at 12:26
  • As there is a difference to upgrade it to 1.8 then to 1.11 and not to upgrade it to 1.11 only? @Alasdair – Ahmed Mohamed Jul 26 '17 at 12:29
  • For most Django upgrades there are backwards incompatibilities that you have to fix. If you upgrade straight to 1.11, then you need to fix them all at once, and you will miss useful deprecation warnings that will point out potential problems to you. – Alasdair Jul 26 '17 at 12:32
  • ok i will try what you said, thanks for you. @Alasdair – Ahmed Mohamed Jul 26 '17 at 12:35
  • You have a many-to-many-field `UserProfile.role`, which is clashing with your model `Userprofile_Roles`. Are you sure you need both of these? Why do you need the `Userprofile_Roles` model? Do you want to use it as the [`through`](https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ManyToManyField.through) option in the many-to-many field? – Alasdair Jul 26 '17 at 12:36
  • 1
    It may help you: https://stackoverflow.com/questions/26591399/django-1-7-conflicting-models – Brown Bear Jul 26 '17 at 12:36
  • @Alasdair i upgrade it to 1.7 and then to 1.8 but it still gives me the same error . – Ahmed Mohamed Jul 26 '17 at 13:09
  • 1
    I didn't say that upgrading step by step would solve your problem. As I said, your `UserProfile.role` and `Userprofile_Roles` clash. You need to decide whether or not you really need the `Userprofile_Roles model. – Alasdair Jul 26 '17 at 13:13
  • Ok i want to try not to use Userprofile_Roles and see what happens. @Alasdair – Ahmed Mohamed Jul 26 '17 at 13:18

1 Answers1

1

Your many to many field UserProfile.roles is clashing with your model Userprofile_Roles.

class UserProfile(models.Model):
    roles = models.ManyToManyField(Role, null=True, blank=True)

It looks like you could use the through option to say you want to use the Userprofile_Roles.

class UserProfile(models.Model):
    roles = models.ManyToManyField(Role, through='Userprofile_Roles', null=True, blank=True)

However, since your Userprofile_Roles does not add any extra fields, it might be simpler to leave the UserProfile model as it is, and remove the Userprofile_Roles model.

Alasdair
  • 298,606
  • 55
  • 578
  • 516