I have created 2 separate model files called 'Topics' and 'SubTopics'. My SubTopic model class import Topic class because sub topic cannot be created without a topic. This all works pretty well until i try to add the functionality to delete topics.
Before deleting the topic i have to check whether that selected topic has any sub topics, and if it does avoiding user from deleting that main topic. so in order to achieve this i had to import 'SubTopic' class inside 'Topic' to check the no of sub topics exists for the topic the user tries to delete.
this cause the app to crash because the 'SubTopic' already importing the 'Topic' so by importing 'SubTopic' inside 'Topic' created ImportError.
How to resolve this issue? I like to keep each model in separate classes for readability and cleanness.
This is my directory listing,
/
model/
Topic.py
SubTopic.py
run.py
Please find below the code,
Topic.py
import datetime
import uuid
import os
# from model.Questions import Questions ---- > ImportError
# from model.SubTopics import SubTopics -----> ImportError
from app import db
from flask.ext.admin.contrib.mongoengine import ModelView
from flask.ext.login import current_user
from Users import User
from flask import request, flash
from constants import *
from wtforms.fields import FileField
from flask.ext.admin.model.template import macro
from wtforms.validators import ValidationError
class Topics(db.Document):
topicName = db.StringField(required=True)
haveSubtopics = db.BooleanField()
image = db.StringField()
createdBy = db.ReferenceField(User)
updatedBy = db.ReferenceField(User)
createdDate = db.DateTimeField(default=datetime.datetime.now())
def get_all_topics(self):
topicList = Topics.objects.all()
if(topicList):
return topicList
else:
return None
def get_topic(self, id):
topic = Topics.objects.get(pk=id)
if(topic):
return topic
else:
return None
def __unicode__(self):
return self.topicName
def delete(self):
dataCnt = 0
if self.haveSubtopics:
dataCnt = SubTopics.objects(mainTopic=self.pk).count() ---> Check sub topic exits before delete
else:
dataCnt = Questions.objects(topic=self.pk).count() ----> Check questions exits before delete
if dataCnt > 0:
flash('Cannot delete this topic. Questions or sub topic exists under this topic')
return False
else:
if not self.image is None:
if os.path.isfile(self.image):
os.unlink(self.image)
self.delete()
return True
class TopicsView(ModelView):
def is_accessible(self):
if current_user.is_authenticated():
return True
else:
return False
column_list = ('topicName','createdDate','haveSubtopics')
column_labels = dict(topicName='Topic', createdDate='Created Date', haveSubtopics='Sub Topics')
form_excluded_columns = ('createdBy','createdDate', 'updatedBy')
create_template = 'create_topic_form.html'
edit_template = 'edit_topic_form.html'
list_template = 'list_topics.html'
SubTopics.py
import datetime
from app import db
from model.Topics import Topics
from flask.ext.admin.contrib.mongoengine import ModelView
from flask.ext.login import current_user
from Users import User
from constants import *
from flask import request
from wtforms.validators import ValidationError
from flask.ext.admin.model.template import macro
class SubTopics(db.Document):
subTopicName = db.StringField(required=True)
mainTopic = db.ReferenceField(Topics, required=True)
createdBy = db.ReferenceField(User, required=True)
createdDate = db.DateTimeField(default=datetime.datetime.now())
def get_all_subtopics(self, topicid):
subTopicList = SubTopics.objects(mainTopic=topicid)
if(subTopicList):
return subTopicList
else:
return None
def __unicode__(self):
return self.subTopicName
class SubTopicsView(ModelView):
def is_accessible(self):
if current_user.is_authenticated():
return True
else
return False
column_list = ('subTopicName','mainTopic', 'createdDate')
column_labels = dict(subTopicName='Name', mainTopic='Topic', createdDate = 'Created Date')
form_excluded_columns = ('createdBy','createdDate')
def check_mainTopic(self, form):
topi = request.form['mainTopic']
topicObj = Topics.objects.with_id(topi)
if topicObj:
if not topicObj.haveSubtopics:
raise ValidationError('Selected topic cannot have sub topics')
form_args = dict(
subTopicName=dict(label='Name'),
mainTopic=dict(label='Topic', validators = [check_mainTopic])
)
list_template = 'list_sub_topics.html'
Thanks in advanced,