class Collateral(BaseModel): name = models.CharField(max_length=256) thumbnail = models.URLField(null=True, blank=True) category = models.ForeignKey('product.Category', null=True, blank=True, on_delete=models.PROTECT) url = models.URLField() collateral_type = models.CharField(max_length=16, choices=get_choices( Constants.COLLATERALS_TYPE)) collateral_file_type = models.CharField(max_length=32, choices=get_choices( Constants.COLLATERALS_CHOICES)) promocode = models.ForeignKey('users.PromoCode', on_delete=models.PROTECT) short_descripton = models.CharField(max_length=256, null=True, blank=True) long_descripton = models.TextField(null=True, blank=True) order = models.IntegerField(default=0) def __str__(self): return '%s | %s: %s' % (self.name, self.collateral_type, self.collateral_file_type) class Meta: ordering = ('order', )
class Member(BaseModel): application = models.ForeignKey('sales.Application', on_delete=models.CASCADE) relation = models.CharField(max_length=128, choices=get_choices( Constants.RELATION_CHOICES), db_index=True) first_name = models.CharField(max_length=128, blank=True) last_name = models.CharField(max_length=128, blank=True) dob = models.DateField(null=True) gender = models.CharField(choices=get_choices(Constants.GENDER), max_length=16, null=True) occupation = models.CharField(choices=get_choices( Constants.OCCUPATION_CHOICES), max_length=32, null=True, blank=True) height = models.FloatField(default=0.0) weight = models.FloatField(default=0.0) ignore = models.BooleanField(default=None, db_index=True, null=True) def save(self, *ar, **kw): try: self.__class__.objects.get(pk=self.id) except self.__class__.DoesNotExist: if self.relation not in [ 'son', 'daughter' ] and self.__class__.objects.filter( relation=self.relation, application_id=self.application_id).exists(): raise IntegrityError('%s relation already exists.' % self.relation) super(Member, self).save(*ar, **kw) def update_fields(self, **kw): for field in kw.keys(): setattr(self, field, kw[field]) self.save() def get_full_name(self): name = '%s %s' % (self.first_name, self.last_name) return name.strip() @property def age(self): if self.dob: return int((now().today().date() - self.dob).days / 365.2425) @property def height_foot(self): return int(self.height / 30.48) @property def height_inches(self): return round((self.height - self.height_foot * 30.48) / 2.54, 2) def __str__(self): return '%s | %s' % (self.relation.title(), self.application.__str__())
class Article(BaseModel): heading = models.CharField(max_length=256) tags = models.CharField(max_length=32, choices=get_choices( Constants.CATEGORIES_AVAILABLE)) url = models.URLField() short_descripton = models.CharField(max_length=512) image = models.ImageField(null=True)
class ContactUs(BaseModel): full_name = models.CharField(max_length=512) phone_no = models.CharField(max_length=10) email = models.EmailField(max_length=50) message = models.TextField(null=True, blank=True) def __str__(self): return "{} - {}".format(self.phone_no, self.full_name)
class BankBranch(models.Model): bank = models.ForeignKey('content.Bank', on_delete=models.CASCADE) branch_name = models.CharField(max_length=128, db_index=True) ifsc = models.CharField(max_length=15, unique=True, db_index=True) city = models.CharField(max_length=64, db_index=True) def __str__(self): return '%s => %s:%s' % (self.bank.name, self.branch_name, self.ifsc)
class KYCDocument(BaseModel): contact = models.ForeignKey( 'crm.Contact', on_delete=models.CASCADE, null=True, blank=True) document_number = models.CharField(max_length=64) document_type = models.CharField( choices=get_choices(Constants.KYC_DOC_TYPES), max_length=16) file = models.FileField( upload_to=get_kyc_upload_path, null=True, blank=True)
class Playlist(BaseModel): name = models.CharField(max_length=32) url = models.URLField() playlist_type = models.CharField(max_length=32, choices=get_choices( Constants.PLAYLIST_CHOICES)) def __str__(self): return '%s | %s: %s' % (self.name, self.playlist_type, self.url)
class ProductVariant(BaseModel): company_category = models.ForeignKey('product.CompanyCategory', null=True, blank=True, on_delete=models.CASCADE) parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE) name = models.CharField(max_length=256, default="", verbose_name="Product Name") parent_product = models.CharField(max_length=128, null=True, blank=True, default='GoPlannr') feature_variant = models.CharField(max_length=256, default='base') short_description = models.CharField(max_length=128, null=True, blank=True) long_description = models.TextField(null=True, blank=True) online_process = models.BooleanField(default=False) is_active = models.BooleanField(default=True) chronic = models.BooleanField(default=True) def get_product_details(self): return { 'name': self.product_short_name, 'company': self.company_category.company.name, 'logo': self.logo, 'variant_name': self.product_short_name } @cached_property def logo(self): from goplannr.settings import DEBUG return (Constants.DEBUG_HOST if DEBUG else '') + self.company_category.company.logo.url @cached_property def product_short_name(self): return self.name def get_basic_details(self): return dict(toll_free_number=', '.join( self.company_category.company.toll_free_number), brochure=self.get_help_file('sales_brochure'), claim_form=self.get_help_file('claim_form')) def get_help_file(self, file_type): from content.models import HelpFile helpfile = HelpFile.objects.filter(product_variant_id=self.id, file_type=file_type).first() return helpfile.file.url if helpfile else '-' def __str__(self): return self.product_short_name
class Appointment(BaseModel): user = models.ForeignKey('users.User', on_delete=models.CASCADE) category = models.ForeignKey('product.Category', on_delete=models.CASCADE) lead = models.ForeignKey('crm.Lead', on_delete=models.CASCADE, null=True, blank=True) name = models.CharField(max_length=128) phone_no = models.CharField(max_length=10) address = models.TextField() date = models.DateField()
class Category(BaseModel): name = models.CharField(max_length=128, db_index=True) description = models.TextField(null=True, blank=True) logo = models.ImageField(upload_to=Constants.CATEGORY_UPLOAD_PATH, default=Constants.DEFAULT_LOGO) hexa_code = models.CharField(max_length=8, default=Constants.DEFAULT_HEXA_CODE) is_active = models.BooleanField(default=False) commission = models.FloatField(default=Constants.DEFAULT_COMMISSION) def __str__(self): return self.name
class IPAddress(BaseModel): account = models.ForeignKey( 'users.Account', on_delete=models.PROTECT, null=True, blank=True) ip_address = models.CharField(max_length=16) company_name = models.CharField(max_length=128) authentication_required = models.BooleanField(default=True) blocked = models.BooleanField(default=False) @classmethod def _get_whitelisted_networks(cls): return cls.objects.filter( blocked=False).values_list('ip_address', flat=True)
class Address(BaseModel): flat_no = models.CharField(max_length=64, blank=True) street = models.CharField(max_length=128, blank=True) landmark = models.CharField(max_length=128, blank=True) pincode = models.ForeignKey('users.Pincode', on_delete=models.CASCADE) @property def full_address(self): return '%s %s %s %s'.strip() % ( self.flat_no, self.street, self.landmark, self.pincode) def __str__(self): return self.full_address
class SubcriberEnterprise(BaseModel): name = models.CharField( max_length=64, default=Constants.DEFAULT_ENTERPRISE) companies = models.ManyToManyField('product.Company', blank=True) categories = models.ManyToManyField('product.Category', blank=True) hexa_code = models.CharField(max_length=8, default='#005db1') logo = models.ImageField( upload_to=Constants.ENTERPRISE_UPLOAD_PATH, default=Constants.DEFAULT_LOGO) person = GenericRelation( 'users.User', related_query_name='subscriber_enterprise_user', object_id_field='enterprise_id') commission = models.FloatField(default=0.0) def __str__(self): return self.name
class PromoBook(BaseModel): phone_no = models.CharField(max_length=10) def save(self, *args, **kwargs): from users.tasks import send_sms send_sms.delay(self.phone_no, Constants.PROMO_MESSAGE % self.phone_no) super(PromoBook, self).save(*args, **kwargs)
class CompanyDetails(BaseModel): company = models.OneToOneField('product.Company', on_delete=models.CASCADE) fact_file = models.TextField(null=True, blank=True) joint_venture = models.TextField(null=True, blank=True) formation_year = models.CharField(max_length=4, null=True, blank=True) market_share = models.TextField(null=True, blank=True) additional_info = models.TextField(null=True, blank=True)
class Question(BaseModel): category = models.ForeignKey('product.Category', on_delete=models.CASCADE) title = models.CharField(max_length=32) question_type = models.CharField(max_length=10, choices=get_choices( constants.QUESTION_COICES), default="single") question = models.TextField() order = models.IntegerField(default=0) ignore = models.BooleanField(default=False) class Meta: ordering = ('order', ) def __str__(self): return self.title
class Lead(BaseModel): user = models.ForeignKey('users.user', on_delete=models.CASCADE) contact = models.ForeignKey( 'crm.Contact', null=True, blank=True, on_delete=models.CASCADE) campaign = models.ForeignKey( 'users.Campaign', null=True, blank=True, on_delete=models.CASCADE) pincode = models.CharField(max_length=6, null=True) bookmark = models.BooleanField(default=False) is_client = models.BooleanField(default=False) ignore = models.BooleanField(default=False) class Meta: ordering = ('-bookmark',) def create_opportunity(self, validated_data): instance = Opportunity.objects.create( lead_id=self.id, category_id=validated_data['category_id']) instance.update_category_opportunity(validated_data) return instance def get_quotes(self): from sales.models import Quote return Quote.objects.filter( opportunity__lead_id=self.id, ignore=False).exclude(status='rejected') def __str__(self): return "%s - Contact: %s" % ( self.user.get_full_name(), self.contact.first_name if self.contact else 'Pending')
class Pincode(models.Model): pincode = models.CharField( max_length=6, unique=True, db_index=True) city = models.CharField(max_length=64, db_index=True) state = models.ForeignKey( 'users.State', null=True, blank=True, on_delete=models.CASCADE) def __str__(self): return '%s - %s(%s)' % (self.city, self.pincode, self.state.name) @classmethod def get_pincode(cls, pincode): pincodes = cls.objects.filter(pincode=pincode) if pincodes.exists(): return pincodes.get() return None
class KYCDocument(BaseModel): account = models.ForeignKey('users.Account', on_delete=models.CASCADE) document_type = models.CharField( choices=get_choices(Constants.KYC_DOC_TYPES), max_length=16) document_number = models.CharField(max_length=64, null=True, blank=True) file = models.FileField(upload_to=get_kyc_upload_path) ignore = models.BooleanField(default=False) def save(self, *args, **kwargs): previous = self.__class__.objects.filter( document_type=self.document_type, account_id=self.id) if previous.exists(): previous.update(ignore=True) super(self.__class__, self).save(*args, **kwargs) def __str__(self): return self.document_type
class Policy(BaseModel): application = models.OneToOneField('sales.Application', on_delete=models.CASCADE) policy_number = models.CharField(max_length=64, blank=True, null=True) policy_data = JSONField(default=dict) policy_file = models.FileField(upload_to=Constants.POLICY_UPLOAD_PATH, null=True, blank=True)
class NetworkHospital(BaseModel): name = models.CharField(blank=True, max_length=256, db_index=True) company = models.ForeignKey('product.Company', null=True, on_delete=models.CASCADE, blank=True) pincode = models.ForeignKey('users.Pincode', on_delete=models.CASCADE, blank=True) address = models.TextField() contact_number = models.CharField(blank=True, max_length=100, db_index=True) def get_full_address(self): return '%s, %s, %s (%s)' % (self.address, self.pincode.city, self.pincode.state, self.pincode.pincode)
class ExistingPolicies(BaseModel): application = models.ForeignKey('sales.Application', on_delete=models.CASCADE, null=True, blank=True) insurer = models.CharField(max_length=128) suminsured = models.FloatField(default=0) deductible = models.FloatField(default=0)
class ProposerDocument(BaseModel): contact = models.ForeignKey('crm.Contact', on_delete=models.CASCADE) document_number = models.CharField(max_length=64, null=True, blank=True) document_type = models.CharField(choices=get_choices( Constants.KYC_DOC_TYPES), max_length=16) file = models.FileField(upload_to=get_proposer_upload_path, null=True, blank=True) ignore = models.BooleanField(default=False) def save(self, *args, **kwargs): previous = self.__class__.objects.filter( document_type=self.document_type, contact_id=self.contact_id) if previous.exists(): previous.update(ignore=True) super(self.__class__, self).save(*args, **kwargs)
class Note(BaseModel): lead = models.ForeignKey('crm.Lead', on_delete=models.PROTECT) title = models.CharField(max_length=128) text = models.TextField() read = models.BooleanField(default=False) ignore = models.BooleanField(default=False) def __str__(self): return self.title
class HelpFile(BaseModel): title = models.CharField(max_length=62, null=True, blank=True) product_variant = models.ForeignKey('product.ProductVariant', on_delete=models.CASCADE) file = models.FileField(upload_to=Constants.HELP_FILES_PATH) file_type = models.CharField(choices=get_choices( Constants.HELP_FILES_TYPE), default="all", max_length=32) def __str__(self): return '%s: %s %s' % ( self.file_type.title().replace( '_', ' '), self.product_variant.company_category.company.name, self.product_variant.company_category.category.name) class Meta: ordering = ('-created', )
class Faq(BaseModel): category = models.ForeignKey('product.Category', on_delete=models.CASCADE) question = models.CharField(max_length=264) answer = models.TextField() def __str__(self): return '%s: %s' % (self.category.name, self.question) class Meta: ordering = ('id', )
class Feature(BaseModel): feature_master = models.ForeignKey('product.FeatureMaster', null=True, blank=True, on_delete=models.CASCADE) product_variant = models.ForeignKey('product.ProductVariant', null=True, blank=True, on_delete=models.CASCADE) rating = models.FloatField(default=0.0) short_description = models.CharField(max_length=156, null=True, blank=True) long_description = models.CharField(max_length=512, null=True, blank=True) class Meta: ordering = ('feature_master__order', ) def __str__(self): return "%s - %s" % (self.product_variant.name, self.feature_master.name)
class FeatureMaster(BaseModel): category = models.ForeignKey('product.Category', null=True, blank=True, on_delete=models.CASCADE) name = models.CharField(max_length=127, default="") order = models.IntegerField(default=1) feature_type = models.CharField(max_length=32, default='Others', choices=get_choices( Constants.FEATURE_TYPES)) short_description = models.CharField(max_length=128, null=True, blank=True) long_description = models.TextField(null=True, blank=True) def __str__(self): return "%s - %s" % (self.name, self.category.name) class Meta: ordering = ('order', )
class CompanyCategory(BaseModel): category = models.ForeignKey('product.Category', on_delete=models.CASCADE) company = models.ForeignKey('product.Company', on_delete=models.CASCADE) claim_settlement = models.CharField(max_length=128, null=True, blank=True) offer_flag = models.BooleanField(default=False) class Meta: unique_together = ('category', 'company') def __str__(self): return '%s - %s' % (self.company.short_name, self.category.name)
class ApplicationRequestLog(BaseModel): application = models.ForeignKey('sales.application', on_delete=models.PROTECT) request_type = models.CharField(max_length=32, choices=get_choices( Constants.REQUEST_CHOICES)) url = models.URLField(null=True, blank=True) payload = JSONField(default=dict) response = JSONField(default=dict) class Meta: ordering = ('-modified', )