Revision 6e3bb9c8 snf-astakos-app/astakos/im/models.py

b/snf-astakos-app/astakos/im/models.py
596 596
    def email_change_is_pending(self):
597 597
        return self.emailchanges.count() > 0
598 598

  
599
    def get_pending_email_change(self):
600
        return self.emailchanges.get()
601

  
602
    @property
603
    def email_address_log(self):
604
        from astakos.im.util import email_address_log
605
        return email_address_log(self.email, skip_current=True)
606

  
599 607
    @property
600 608
    def status_display(self):
601 609
        msg = ""
......
609 617
            msg = "Pending email verification"
610 618
        if not self.moderated:
611 619
            msg = "Pending moderation"
612
        if not self.is_active and self.email_verified:
620
        if not self.is_active and self.is_accepted():
613 621
            msg = "Accepted/Inactive"
614 622
            if self.deactivated_reason:
615 623
                msg += " (%s)" % (self.deactivated_reason)
......
1052 1060

  
1053 1061
class EmailChangeManager(models.Manager):
1054 1062

  
1063
    def get_query_set(self):
1064
        """
1065
        Exclude consumed email change objects by default.
1066
        """
1067
        qs = super(EmailChangeManager, self).get_query_set()
1068
        return qs.filter(is_consumed=False)
1069

  
1070
    def consumed(self):
1071
        qs = super(EmailChangeManager, self).get_query_set()
1072
        return qs.filter(is_consumed=True)
1073

  
1055 1074
    @transaction.commit_on_success
1056 1075
    def change_email(self, activation_key):
1057 1076
        """
......
1090 1109
            old_email = user.email
1091 1110
            user.set_email(email_change.new_email_address)
1092 1111
            user.save()
1093
            email_change.delete()
1112
            email_change.replaced_email_address = old_email
1113
            email_change.set_consumed()
1114
            email_change.save()
1094 1115
            msg = "User %s changed email from %s to %s"
1095 1116
            logger.log(astakos_settings.LOGGING_LEVEL, msg, user.log_display,
1096 1117
                       old_email, user.email)
......
1105 1126
        help_text=_('Provide a new email address. Until you verify the new '
1106 1127
                    'address by following the activation link that will be '
1107 1128
                    'sent to it, your old email address will remain active.'))
1129
    replaced_email_address = models.EmailField(blank=True, null=True,
1130
                                               default=None)
1108 1131
    user = models.ForeignKey(
1109
        AstakosUser, unique=True, related_name='emailchanges')
1132
        AstakosUser, related_name='emailchanges')
1110 1133
    requested_at = models.DateTimeField(auto_now_add=True)
1111 1134
    activation_key = models.CharField(
1112 1135
        max_length=40, unique=True, db_index=True)
1136
    cancel_key = models.CharField(max_length=40, unique=True, db_index=True)
1137
    is_consumed = models.BooleanField(default=False)
1138
    consumed_at = models.DateTimeField(_('Consumption date'),
1139
                                    null=True, blank=True)
1113 1140

  
1114 1141
    objects = EmailChangeManager()
1115 1142

  
1143
    def set_consumed(self):
1144
        self.is_consumed = True
1145
        self.consumed_at = datetime.now()
1146

  
1116 1147
    def get_url(self):
1117
        return reverse('email_change_confirm',
1118
                       kwargs={'activation_key': self.activation_key})
1148
        return reverse('email_change_confirm', kwargs={
1149
            'activation_key': self.activation_key
1150
        })
1151

  
1152
    def get_cancel_url(self):
1153
        return reverse('email_change_cancel', kwargs={
1154
            'cancel_key': self.cancel_key
1155
        })
1119 1156

  
1120 1157
    def activation_key_expired(self):
1121 1158
        expiration_date = timedelta(
1122 1159
            days=astakos_settings.EMAILCHANGE_ACTIVATION_DAYS)
1123 1160
        return self.requested_at + expiration_date < datetime.now()
1124 1161

  
1162
    def __unicode__(self):
1163
        return "%r from:%r to:%r consumed:%r" % (
1164
            self.__class__, self.new_email_address,
1165
            self.replaced_email_address, self.consumed_at)
1166

  
1167

  
1125 1168

  
1126 1169
class AdditionalMail(models.Model):
1127 1170
    """

Also available in: Unified diff