class CreditCard(models.Model): customer = models.ForeignKey(Customer, related_name='credit_cards') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) stripe_card_id = models.CharField(max_length=255, null=True) extra_data = JSONField() is_active = models.BooleanField(default=False) def save(self, *args, **kwargs): if self.is_active: self.customer.credit_cards.update(is_active=False) self.is_active = True super(CreditCard, self).save(*args, **kwargs) def __unicode__(self): return u'Credit Card #{}'.format(self.pk) @property def card_type(self): return self.extra_data.get('brand') @property def last4(self): return self.extra_data.get('last4') @property def exp_month(self): return self.extra_data.get('exp_month') @property def exp_year(self): return self.extra_data.get('exp_year')
def test_can_override_formfield(self): model_field = JSONField() class FakeFieldClass(object): def __init__(self, *args, **kwargs): pass form_field = model_field.formfield(form_class=FakeFieldClass) self.assertIsInstance(form_field, FakeFieldClass)
class Customer(models.Model): user = models.OneToOneField('accounts.User', related_name='stripe_customer') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) stripe_customer_id = models.CharField(max_length=255, null=True) extra_data = JSONField() def __unicode__(self): return u'Customer #{}'.format(self.pk)
class Transaction(models.Model): ESCROW = 'escrow' MILESTONE = 'milestone' CREDIT = 'credit' PAYOUT = 'payout' PAYPAL_PAYOUT = 'paypal-payout' REFERRAL_PAYMENT = 'referral-payment' TRANSACTION_TYPE_CHOICES = ( (ESCROW, 'Payment to Escrow'), (MILESTONE, 'Payment to Milestone'), (CREDIT, 'Credit'), (PAYOUT, 'Payout'), (PAYPAL_PAYOUT, 'PayPal payout'), (REFERRAL_PAYMENT, 'Referral payment'), ) payout_method = models.ForeignKey(PayoutMethod, related_name='transactions', blank=True, null=True) credit_card = models.ForeignKey(CreditCard, related_name='transactions', blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) stripe_id = models.CharField(max_length=255, null=True, blank=True) extra_data = JSONField() payer = models.ForeignKey('accounts.User', null=True, blank=True, related_name='payment_transactions') receiver = models.ForeignKey('accounts.User', null=True, blank=True, related_name='received_transactions') referrer = models.ForeignKey('accounts.User', null=True, blank=True, related_name='referrals_transactions') referrer_email = models.EmailField(null=True, blank=True) amount = models.DecimalField(max_digits=12, decimal_places=2) referrer_amount = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True) fee = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank=True) transaction_type = models.CharField(max_length=255, choices=TRANSACTION_TYPE_CHOICES) milestone = models.ForeignKey('projects.Milestone', null=True, blank=True) displayed_at = models.DateTimeField(null=True, blank=True) is_confirm_email_sent = models.BooleanField(default=False) def __unicode__(self): return u'Transaction #{}'.format(self.pk) @property def milestone_name(self): return self.milestone.name if self.milestone else None @property def project_name(self): return self.milestone.project.name if self.milestone and self.milestone.project else None def get_user(self): if self.transaction_type == Transaction.ESCROW: return self.receiver return self.payer
class PayoutMethod(models.Model): user = models.ForeignKey('accounts.User', related_name='payout_methods') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) stripe_recipient_id = models.CharField(max_length=255, null=True) extra_data = JSONField() name = models.CharField(max_length=255, null=True, blank=True) address1 = models.CharField(max_length=255, null=True, blank=True) address2 = models.CharField(max_length=255, null=True, blank=True) city = models.CharField(max_length=255, null=True, blank=True) state = models.CharField(max_length=255, null=True, blank=True) zip_code = models.CharField(max_length=255, null=True, blank=True) country = models.CharField(max_length=255, null=True, blank=True) is_active = models.BooleanField(default=False) def save(self, *args, **kwargs): if self.is_active: self.user.payout_methods.update(is_active=False) self.is_active = True super(PayoutMethod, self).save(*args, **kwargs) def __unicode__(self): return u'PayoutMethod #{}'.format(self.pk) @property def bank_name(self): return self.extra_data.get('active_account', {}).get('bank_name') @property def routing_number(self): return self.extra_data.get('active_account', {}).get('routing_number') @property def last4(self): return self.extra_data.get('active_account', {}).get('last4')
class AuditLog(TimeStampedModel): """An audit log of events and notes. Inherits ``created`` and ``modified`` from TimeStampedModel """ user = models.ForeignKey(USER_MODEL) # Generic Foreign Key next three fields content_type = models.ForeignKey(ContentType, null=True, blank=True) object_id = models.PositiveIntegerField(null=True) content_object = generic.GenericForeignKey('content_type', 'object_id') audit_type = models.IntegerField(default=LOG, choices=AUDIT_CHOICES) action = models.CharField( max_length=128, null=True, blank=True, help_text='method triggering audit', db_index=True, ) action_response = JSONField(help_text='HTTP response from action') action_note = models.TextField( blank=True, null=True, help_text='either the note text or a description of the action', ) organization = models.ForeignKey(Organization, related_name='audit_logs') class Meta: ordering = ('-created', ) # extends djorm_expressions.models.ExpressionManager to prevent update of # non-notes objects = AuditLogManager() def __unicode__(self): return u'{0} <{1}> ({2})'.format(self.get_audit_type_display(), self.user, self.pk) def save(self, *args, **kwargs): """Ensure that only notes are saved""" if self.audit_type != NOTE and self.pk: raise PermissionDenied('AuditLogs cannot be edited, only notes') return super(AuditLog, self).save(*args, **kwargs) def to_dict(self): """serializes an audit_log""" # avoid cyclical import from seed.models import obj_to_dict log_dict = obj_to_dict(self) log_dict['audit_type'] = self.get_audit_type_display() log_dict['user'] = { 'first_name': self.user.first_name, 'last_name': self.user.last_name, 'email': self.user.email, 'id': self.user.pk, } log_dict['organization'] = { 'id': self.organization.pk, 'name': self.organization.name, } log_dict['content_type'] = self.content_object._meta.model_name return log_dict
class TextModel(models.Model): data = JSONField() objects = ExpressionManager()
class SEEDUser(AbstractBaseUser, PermissionsMixin): """ An abstract base class implementing a fully featured User model with admin-compliant permissions. Username, password and email are required. Other fields are optional. """ username = models.EmailField( _('username (email)'), unique=True, help_text=_('User\'s email address. Used for auth as well.')) first_name = models.CharField(_('first name'), max_length=30, blank=True) last_name = models.CharField(_('last name'), max_length=30, blank=True) email = models.EmailField(_('email address'), blank=True) is_staff = models.BooleanField( _('staff status'), default=False, help_text=_('Designates whether the user can log into this admin ' 'site.')) is_active = models.BooleanField( _('active'), default=True, help_text=_('Designates whether this user should be treated as ' 'active. Unselect this instead of deleting accounts.')) date_joined = models.DateTimeField(_('date joined'), default=timezone.now) default_custom_columns = JSONField() show_shared_buildings = models.BooleanField( _('active'), default=False, help_text=_('shows shared buildings within search results')) default_organization = models.ForeignKey( Organization, blank=True, null=True, related_name='default_users' ) api_key = models.CharField( _('api key'), max_length=128, blank=True, default='', db_index=True ) objects = UserManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['email'] class Meta: verbose_name = _('user') verbose_name_plural = _('users') def get_absolute_url(self): return "/users/%s/" % urlquote(self.username) def get_full_name(self): """ Returns the first_name plus the last_name, with a space in between. """ full_name = '%s %s' % (self.first_name, self.last_name) return full_name.strip() def get_short_name(self): "Returns the short name for the user." return self.first_name def email_user(self, subject, message, from_email=None): """ Sends an email to this User. """ send_mail(subject, message, from_email, [self.email]) def get_profile(self): """ Returns site-specific profile for this user. Raises SiteProfileNotAvailable if this site does not allow profiles. """ warnings.warn( ( "The use of AUTH_PROFILE_MODULE to define user profiles has " "been deprecated." ), DeprecationWarning, stacklevel=2) if not hasattr(self, '_profile_cache'): from django.conf import settings if not getattr(settings, 'AUTH_PROFILE_MODULE', False): raise SiteProfileNotAvailable( 'You need to set AUTH_PROFILE_MODULE in your project ' 'settings') try: app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.') except ValueError: raise SiteProfileNotAvailable( 'app_label and model_name should be separated by a dot in ' 'the AUTH_PROFILE_MODULE setting') try: model = models.get_model(app_label, model_name) if model is None: raise SiteProfileNotAvailable( 'Unable to load the profile model, check ' 'AUTH_PROFILE_MODULE in your project settings') self._profile_cache = model._default_manager.using( self._state.db).get(user__id__exact=self.id) self._profile_cache.user = self except (ImportError, ImproperlyConfigured): raise SiteProfileNotAvailable return self._profile_cache def generate_key(self): """ Creates and sets an API key for this user. Adapted from tastypie: https://github.com/toastdriven/django-tastypie/blob/master/tastypie/models.py#L47 # noqa """ new_uuid = uuid.uuid4() api_key = hmac.new(new_uuid.bytes, digestmod=sha1).hexdigest() self.api_key = api_key self.save() def save(self, *args, **kwargs): """ Ensure that email and username are synced. """ if self.email.lower() != self.username: self.email = self.username return super(SEEDUser, self).save(*args, **kwargs)
class User(AbstractBaseUser, PermissionsMixin): PROJECT_OWNER = 'project-owner' DEVELOPER = 'developer' OTHER = 'other' USER_TYPES = ( (PROJECT_OWNER, 'Project Owner'), (DEVELOPER, 'Developer'), (OTHER, 'Other'), ) first_name = models.CharField(max_length=255, blank=True, null=True) last_name = models.CharField(max_length=255, blank=True, null=True) email = models.EmailField(unique=True) phone = models.CharField(max_length=255, blank=True, null=True) location = models.CharField(max_length=255, blank=True, null=True) city = models.ForeignKey('cities_light.City', blank=True, null=True) is_staff = models.BooleanField( _('staff status'), default=False, help_text=_('Designates whether the user can log into this admin ' 'site.')) is_active = models.BooleanField( _('active'), default=False, help_text=_('Designates whether this user should be treated as ' 'active. Unselect this instead of deleting accounts.')) date_joined = models.DateTimeField(_('date joined'), default=timezone.now) avatar = models.FileField(upload_to=avatar_upload_to, blank=True, null=True) referral_code = models.CharField(max_length=255, blank=True, null=True) referrer = models.ForeignKey('self', related_name='invited_users', blank=True, null=True) referrer_email = models.EmailField(blank=True, null=True) ip_address = models.GenericIPAddressField(blank=True, null=True) settings = JSONField() paypal_email = models.EmailField(blank=True, null=True) signup_completed = models.BooleanField(default=False) user_type = models.CharField(max_length=255, choices=USER_TYPES, null=True, blank=True) objects = UserManager() USERNAME_FIELD = 'email' __original_is_active = None def __init__(self, *args, **kwargs): super(User, self).__init__(*args, **kwargs) self.__original_is_active = self.is_active def __unicode__(self): return self.get_full_name() def save(self, *args, **kwargs): if not self.referral_code: self.referral_code = get_referral_code() if self.__original_is_active is False and self.is_active is True: email.send_account_activated_email(self) super(User, self).save(*args, **kwargs) def get_short_name(self): return self.first_name def get_full_name(self): return u'{} {}'.format(self.first_name, self.last_name) @property def payout_method_exists(self): return self.payout_methods.count() > 0 @property def safe_settings(self): return self.settings if isinstance(self.settings, dict) else {}