Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
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')
Esempio n. 4
0
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)
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 8
0
class TextModel(models.Model):
    data = JSONField()
    objects = ExpressionManager()
Esempio n. 9
0
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)
Esempio n. 10
0
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 {}