Skip to content
This repository has been archived by the owner on Aug 26, 2022. It is now read-only.

Commit

Permalink
Bug 692239 update mindtouch when profile is saved
Browse files Browse the repository at this point in the history
Bug 692239 fix locale form field

Bug 692239 (skip) testing of mindtouch profile values
  • Loading branch information
groovecoder committed Nov 19, 2011
1 parent ed6dce6 commit 07a5dc6
Show file tree
Hide file tree
Showing 7 changed files with 261 additions and 61 deletions.
25 changes: 21 additions & 4 deletions apps/dekicompat/backends.py
Expand Up @@ -21,7 +21,7 @@

log = commonware.log.getLogger('mdn.dekicompat')

MINDTOUCH_USER_XML = """<user><username>%(username)s</username><email>%(email)s</email><fullname>%(fullname)s</fullname><status>%(status)s</status><permissions.user><role>%(role)s</role></permissions.user></user>"""
MINDTOUCH_USER_XML = """<user><username>%(username)s</username><email>%(email)s</email><fullname>%(fullname)s</fullname><status>%(status)s</status><language>%(language)s</language><timezone>%(timezone)s</timezone><permissions.user><role>%(role)s</role></permissions.user></user>"""

class DekiUserBackend(object):
"""
Expand Down Expand Up @@ -157,12 +157,29 @@ def mindtouch_login(request):
# TODO: decide WTF to do here
return False

@staticmethod
def generate_mindtouch_user_xml(user):
user_xml = MINDTOUCH_USER_XML % {'username': user.username, 'email': user.email, 'fullname': user.get_profile().fullname, 'status': 'active', 'language': user.get_profile().mindtouch_language, 'timezone': user.get_profile().mindtouch_timezone, 'role': 'Contributor'}
return user_xml

@staticmethod
def post_mindtouch_user(user):
user_url = '%s/@api/deki/users?apikey=%s' % (settings.DEKIWIKI_ENDPOINT, settings.DEKIWIKI_APIKEY)
# post user to mindtouch
user_xml = MINDTOUCH_USER_XML % {'username': user.username, 'email': user.email, 'fullname': user.get_profile().fullname, 'status': 'active', 'role': 'Contributor'}
resp = requests.post(user_url, data=user_xml, headers={'Content-Type': 'application/xml'})
user_xml = DekiUserBackend.generate_mindtouch_user_xml(user)
headers = {'Content-Type': 'application/xml',}
resp = requests.post(user_url, data=user_xml, headers=headers)
if resp.status_code is not 200:
# TODO: decide WTF to do here
pass
return DekiUser.parse_user_info(resp.content)

@staticmethod
def put_mindtouch_user(user):
deki_user_id = user.get_profile().deki_user_id or ''
user_url = '%s/@api/deki/users/%s?apikey=%s' % (settings.DEKIWIKI_ENDPOINT, deki_user_id, settings.DEKIWIKI_APIKEY)
user_xml = DekiUserBackend.generate_mindtouch_user_xml(user)
headers = {'Content-Type': 'application/xml',}
resp = requests.put(user_url, data=user_xml, headers=headers)
if resp.status_code is not 200:
# TODO: decide WTF to do here
pass
Expand Down
8 changes: 7 additions & 1 deletion apps/devmo/forms.py
@@ -1,4 +1,5 @@
from django import forms
from django.conf import settings
from django.core.exceptions import ValidationError

from tower import ugettext_lazy as _
Expand Down Expand Up @@ -42,6 +43,8 @@ class Meta:
max_length=255, required=False)
expertise = forms.CharField(label=_('Expertise'),
max_length=255, required=False)
locale = forms.ChoiceField(required=False,
choices=settings.LANGUAGE_CHOICES)

def __init__(self, *args, **kwargs):
super(UserProfileEditForm, self).__init__(*args, **kwargs)
Expand All @@ -60,7 +63,10 @@ def clean_expertise(self):
expertise = set(parse_tags(cleaned_data['expertise']))

if len(expertise) > 0 and not expertise.issubset(interests):
raise forms.ValidationError(_("Areas of expertise must be a "
raise forms.ValidationError(_("Areas of expertise must be a "
"subset of interests"))

return cleaned_data['expertise']

def clean_timezone(self):
pass
111 changes: 111 additions & 0 deletions apps/devmo/migrations/0013_auto__chg_field_userprofile_locale.py
@@ -0,0 +1,111 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models

class Migration(SchemaMigration):

def forwards(self, orm):

# Changing field 'UserProfile.locale'
db.alter_column('user_profiles', 'locale', self.gf('sumo.models.LocaleField')(max_length=7, null=True))


def backwards(self, orm):

# Changing field 'UserProfile.locale'
db.alter_column('user_profiles', 'locale', self.gf('sumo.models.LocaleField')(max_length=7))


models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'devmo.calendar': {
'Meta': {'object_name': 'Calendar'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'shortname': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
},
'devmo.event': {
'Meta': {'ordering': "['date']", 'object_name': 'Event'},
'calendar': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['devmo.Calendar']"}),
'conference': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'conference_link': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'date': ('django.db.models.fields.DateField', [], {}),
'description': ('django.db.models.fields.TextField', [], {}),
'done': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'location': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'materials': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'people': ('django.db.models.fields.TextField', [], {})
},
'devmo.userprofile': {
'Meta': {'object_name': 'UserProfile', 'db_table': "'user_profiles'"},
'bio': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'content_flagging_email': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'deki_authtoken': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
'deki_user_id': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
'fullname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
'homepage': ('django.db.models.fields.URLField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'irc_nickname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
'locale': ('sumo.models.LocaleField', [], {'default': "'en-US'", 'max_length': '7', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
'location': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
'misc': ('jsonfield.JSONField', [], {'null': 'True', 'blank': 'True'}),
'organization': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
'timezone': ('timezones.fields.TimeZoneField', [], {'default': "'US/Pacific'", 'null': 'True', 'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'taggit.tag': {
'Meta': {'object_name': 'Tag'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
},
'taggit.taggeditem': {
'Meta': {'object_name': 'TaggedItem'},
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
}
}

complete_apps = ['devmo']
25 changes: 22 additions & 3 deletions apps/devmo/models.py
Expand Up @@ -97,9 +97,8 @@ class Meta:
deki_user_id = models.PositiveIntegerField(default=0,
editable=False)
deki_authtoken = models.CharField(max_length=255, blank=True)
timezone = TimeZoneField(null=True, blank=True,
verbose_name=_lazy(u'Timezone'))
locale = LocaleField(db_index=True, verbose_name=_lazy(u'Language'))
timezone = TimeZoneField(null=True, blank=True, verbose_name=_lazy(u'Timezone'))
locale = LocaleField(null=True, blank=True, db_index=True, verbose_name=_lazy(u'Language'))
homepage = models.URLField(max_length=255, blank=True, default='',
verify_exists=False, error_messages={
'invalid': _('This URL has an invalid format. '
Expand Down Expand Up @@ -180,6 +179,26 @@ def allows_editing_by(self, user):
return True
return False

@property
def mindtouch_language(self):
if not self.locale:
return ''
return settings.LANGUAGE_DEKI_MAP[self.locale]

@property
def mindtouch_timezone(self):
if not self.timezone:
return ''
base_seconds = self.timezone._utcoffset.days * 86400
offset_seconds = self.timezone._utcoffset.seconds
offset_hours = (base_seconds + offset_seconds) / 3600
return "%03d:00" % offset_hours

def save(self, *args, **kwargs):
super(UserProfile, self).save(*args, **kwargs)
from dekicompat.backends import DekiUserBackend
DekiUserBackend.put_mindtouch_user(self.user)


def create_user_profile(sender, instance, created, **kwargs):
if created and not kwargs.get('raw', False):
Expand Down
28 changes: 28 additions & 0 deletions apps/devmo/tests/__init__.py
@@ -0,0 +1,28 @@
from django.contrib.auth.models import User

from dekicompat.backends import DekiUser
from devmo.models import UserProfile

def create_profile():
"""Create a user, deki_user, and a profile for a test account"""
user = User.objects.create_user('tester23', 'tester23@example.com',
'trustno1')

deki_user = DekiUser(id=0, username='tester23',
fullname='Tester Twentythree',
email='tester23@example.com',
gravatar='', profile_url=None)

profile = UserProfile()
profile.user = user
profile.fullname = "Tester Twentythree"
profile.title = "Spaceship Pilot"
profile.organization = "UFO"
profile.location = "Outer Space"
profile.bio = "I am a freaky space alien."
profile.irc_nickname = "ircuser"
profile.locale = 'en-US'
profile.timezone = 'US/Central'
profile.save()

return (user, deki_user, profile)
30 changes: 9 additions & 21 deletions apps/devmo/tests/test_models.py
Expand Up @@ -12,7 +12,7 @@

from devmo.models import Calendar, Event, UserProfile, UserDocsActivityFeed

from dekicompat.backends import DekiUser
from dekicompat.backends import DekiUser, DekiUserBackend


APP_DIR = dirname(dirname(__file__))
Expand Down Expand Up @@ -198,24 +198,12 @@ def test_locale_timezone_fields(self):
ok_(hasattr(profile_from_db, 'timezone'))
ok_(str(profile_from_db.timezone) == 'US/Pacific')

def _create_profile(self):
"""Create a user, deki_user, and a profile for a test account"""
user = User.objects.create_user('tester23', 'tester23@example.com',
'trustno1')

deki_user = DekiUser(id=0, username='tester23',
fullname='Tester Twentythree',
email='tester23@example.com',
gravatar='', profile_url=None)

profile = UserProfile()
profile.user = user
profile.fullname = "Tester Twentythree"
profile.title = "Spaceship Pilot"
profile.organization = "UFO"
profile.location = "Outer Space"
profile.bio = "I am a freaky space alien."
profile.irc_nickname = "ircuser"
profile.save()
def test_mindtouch_timezone(self):
user = User.objects.get(username='testuser')
profile = UserProfile.objects.get(user=user)
eq_("-08:00", profile.mindtouch_timezone)

return (user, deki_user, profile)
def test_mindtouch_language(self):
user = User.objects.get(username='testuser')
profile = UserProfile.objects.get(user=user)
eq_("en", profile.mindtouch_language)

0 comments on commit 07a5dc6

Please sign in to comment.