Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch 'master' into refactoring

Conflicts:
	apps/users/models.py
	locale/es/LC_MESSAGES/django.mo
	locale/es/LC_MESSAGES/django.po
	templates/mojo.html
	templates/projects/sidebar.html
  • Loading branch information...
commit 71850fb1e9dbaab000a0d2540ab968eecfa88e91 2 parents e4d351a + d1e15db
@zuzelvp zuzelvp authored
Showing with 678 additions and 165 deletions.
  1. +25 −4 apps/projects/templatetags/project_tags.py
  2. +5 −0 apps/projects/urls.py
  3. +41 −0 apps/projects/views.py
  4. +11 −6 apps/relationships/views.py
  5. +6 −1 apps/users/admin.py
  6. +54 −6 apps/users/forms.py
  7. +59 −0 apps/users/managers.py
  8. +97 −0 apps/users/migrations/0012_auto__chg_field_profiletag_category.py
  9. +9 −3 apps/users/models.py
  10. +3 −1 apps/users/urls.py
  11. +18 −4 apps/users/views.py
  12. BIN  locale/es/LC_MESSAGES/django.mo
  13. +157 −95 locale/es/LC_MESSAGES/django.po
  14. +27 −14 media/css/batucada.css
  15. +10 −1 media/css/style-es.css
  16. +12 −12 templates/_footer.html
  17. +1 −1  templates/activity/_activity_resource.html
  18. +5 −5 templates/base.html
  19. +1 −1  templates/dashboard/dashboard.html
  20. +0 −2  templates/dashboard/splash.html
  21. +86 −0 templates/projects/project_user_list.html
  22. +5 −3 templates/projects/sidebar.html
  23. +1 −1  templates/search/search.html
  24. +16 −0 templates/users/_profile_edit.html
  25. +1 −1  templates/users/_user_card.html
  26. +16 −4 templates/users/profile.html
  27. +12 −0 templates/users/user_list.html
View
29 apps/projects/templatetags/project_tags.py
@@ -10,7 +10,7 @@
register = template.Library()
-def sidebar(context):
+def sidebar(context, max_people_count=64):
user = context['user']
project = context['project']
is_participating = is_following = is_organizing = False
@@ -26,9 +26,27 @@ def sidebar(context):
deleted=False, author=profile)
if answers.exists():
pending_signup = answers[0]
- participants_count = project.non_organizer_participants().count()
- followers_count = project.non_participant_followers().count()
- organizers_count = project.organizers().count()
+
+ organizers = project.organizers()
+ organizers_count = organizers.count()
+ participants = project.non_organizer_participants()
+ participants_count = participants.count()
+ followers = project.non_participant_followers()
+ followers_count = followers.count()
+
+ # only display a subset of the participants and followers.
+ remaining = max_people_count
+ sidebar_organizers = organizers[:remaining]
+ sidebar_participants = []
+ sidebar_followers = []
+ remaining -= sidebar_organizers.count()
+ if remaining > 0:
+ sidebar_participants = participants[:remaining]
+ remaining -= sidebar_participants.count()
+ if remaining > 0:
+ sidebar_followers = followers[:remaining]
+ remaining -= sidebar_followers.count()
+
update_count = project.activities().count()
pending_applicants_count = len(project.pending_applicants())
content_pages = Page.objects.filter(project__pk=project.pk,
@@ -52,6 +70,9 @@ def sidebar(context):
'school': school,
'imported_from': imported_from,
'pending_signup': pending_signup,
+ 'sidebar_organizers': sidebar_organizers,
+ 'sidebar_participants': sidebar_participants,
+ 'sidebar_followers': sidebar_followers,
})
return context
View
5 apps/projects/urls.py
@@ -26,6 +26,11 @@
name='projects_show'),
url(r'^(?P<slug>[\w-]+)/(?P<page>\d+)/$', 'projects.views.show',
name='projects_show'),
+ url(r'^(?P<slug>[\w-]+)/people/$', 'projects.views.user_list',
+ name='projects_user_list'),
+ url(r'^(?P<slug>[\w-]+)/people/' +
+ '(?P<participants_page>\d+)/(?P<followers_page>\d+)/$',
+ 'projects.views.user_list', name='projects_user_list'),
url(r'^(?P<slug>[\w-]+)/contact_organizers/$',
'projects.views.contact_organizers',
name='projects_contact_organizers'),
View
41 apps/projects/views.py
@@ -605,3 +605,44 @@ def task_list(request, slug):
}
return render_to_response('projects/project_task_list.html', context,
context_instance=RequestContext(request))
+
+
+def user_list(request, slug, participants_page=1, followers_page=1):
+ """Display full list of users for the project."""
+ project = get_object_or_404(Project, slug=slug)
+
+ participants = project.non_organizer_participants()
+ participants_paginator = Paginator(participants, 24)
+ try:
+ participants_current_page = participants_paginator.page(
+ participants_page)
+ except EmptyPage:
+ raise http.Http404
+ participants = participants_current_page.object_list
+
+ followers = project.non_participant_followers()
+ followers_paginator = Paginator(followers, 24)
+ try:
+ followers_current_page = followers_paginator.page(followers_page)
+ except EmptyPage:
+ raise http.Http404
+ followers = followers_current_page.object_list
+
+ return render_to_response('projects/project_user_list.html', {
+ 'project': project,
+ 'organizers': project.organizers(),
+ 'participants': participants,
+ 'followers': followers,
+ 'participants_paginator': participants_paginator,
+ 'participants_page_num': participants_page,
+ 'participants_next_page': int(participants_page) + 1,
+ 'participants_prev_page': int(participants_page) - 1,
+ 'participants_num_pages': participants_paginator.num_pages,
+ 'participants_page': participants_current_page,
+ 'followers_paginator': followers_paginator,
+ 'followers_page_num': followers_page,
+ 'followers_next_page': int(followers_page) + 1,
+ 'followers_prev_page': int(followers_page) - 1,
+ 'followers_num_pages': followers_paginator.num_pages,
+ 'followers_page': followers_current_page,
+ }, context_instance=RequestContext(request))
View
17 apps/relationships/views.py
@@ -1,7 +1,7 @@
import logging
from django.db.utils import IntegrityError
-from django.http import HttpResponseRedirect, Http404, HttpResponseForbidden
+from django.http import HttpResponseRedirect, Http404
from django.views.decorators.http import require_http_methods
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext as _
@@ -26,9 +26,11 @@ def follow(request, object_type, slug):
if object_type == PROJECT:
project = get_object_or_404(Project, slug=slug)
relationship = Relationship(source=profile, target_project=project)
+ url = project.get_absolute_url()
elif object_type == USER:
user = get_object_or_404(UserProfile, username=slug)
relationship = Relationship(source=profile, target_user=user)
+ url = user.get_absolute_url()
else:
raise Http404
try:
@@ -41,7 +43,7 @@ def follow(request, object_type, slug):
messages.error(request, _('You are already following this user'))
log.warn("Attempt to create duplicate relationship: %s" % (
relationship,))
- return HttpResponseRedirect(request.META['HTTP_REFERER'])
+ return HttpResponseRedirect(url)
@login_required
@@ -52,13 +54,16 @@ def unfollow(request, object_type, slug):
project = get_object_or_404(Project, slug=slug)
# project.participants() includes project.organizers()
if project.participants().filter(user=profile).exists():
- return HttpResponseForbidden(_("You can't unfollow"))
- Relationship.objects.filter(
- source=profile, target_project=project).delete()
+ messages.error(request, _("You can't unfollow"))
+ else:
+ Relationship.objects.filter(
+ source=profile, target_project=project).delete()
+ url = project.get_absolute_url()
elif object_type == USER:
user = get_object_or_404(UserProfile, username=slug)
Relationship.objects.filter(
source=profile, target_user=user).delete()
+ url = user.get_absolute_url()
else:
raise Http404
- return HttpResponseRedirect(request.META['HTTP_REFERER'])
+ return HttpResponseRedirect(url)
View
7 apps/users/admin.py
@@ -1,5 +1,5 @@
from django.contrib import admin
-from users.models import UserProfile
+from users.models import UserProfile, TaggedProfile
class UserProfileAdmin(admin.ModelAdmin):
@@ -9,4 +9,9 @@ class UserProfileAdmin(admin.ModelAdmin):
list_filter = list_display[5:]
search_fields = list_display[:5]
+
+class TaggedProfileAdmin(admin.ModelAdmin):
+ list_display = ('id', 'tag')
+
admin.site.register(UserProfile, UserProfileAdmin)
+admin.site.register(TaggedProfile, TaggedProfileAdmin)
View
60 apps/users/forms.py
@@ -10,9 +10,11 @@
from drumbeat.utils import CKEditorWidget
from captcha import fields as captcha_fields
+from taggit.forms import TagField
+from taggit.utils import edit_string_for_tags
from users.blacklist import passwords as blacklisted_passwords
-from users.models import UserProfile
+from users.models import UserProfile, TaggedProfile
from users.fields import UsernameField
from users import drupal
from links.models import Link
@@ -45,7 +47,6 @@ def check_password_complexity(password):
class SetPasswordForm(auth_forms.SetPasswordForm):
-
def __init__(self, *args, **kwargs):
super(SetPasswordForm, self).__init__(*args, **kwargs)
@@ -171,13 +172,63 @@ def clean(self):
return data
+class CategoryTagWidget(forms.TextInput):
+ def __init__(self, *args, **kwargs):
+ self.category = kwargs.pop('category', None)
+ super(CategoryTagWidget, self).__init__(*args, **kwargs)
+
+ def render(self, name, value, attrs=None):
+ if value is not None and not isinstance(value, basestring):
+ objs = value.select_related("tag").filter(
+ tag__category=self.category)
+ value = edit_string_for_tags([o.tag for o in objs])
+ return super(CategoryTagWidget, self).render(name, value, attrs)
+
+
+class CategoryTagField(TagField):
+ def __init__(self, **kwargs):
+ category = kwargs.pop('category', None)
+ self.widget = CategoryTagWidget(category=category)
+ super(CategoryTagField, self).__init__(**kwargs)
+
+ def clean(self, value):
+ value = super(CategoryTagField, self).clean(value)
+ value = [i.lower() for i in value]
+ return value
+
+
class ProfileEditForm(forms.ModelForm):
+ interest = CategoryTagField(category='interest', required=False)
+ skill = CategoryTagField(category='skill', required=False)
+ desired_topic = CategoryTagField(category='desired_topic', required=False)
+
+ def __init__(self, *args, **kwargs):
+ super(ProfileEditForm, self).__init__(*args, **kwargs)
+
+ if kwargs.has_key('instance'):
+ instance = kwargs['instance']
+ self.initial['interest'] = TaggedProfile.objects.filter(
+ object_id=instance.id)
+ self.initial['skill'] = TaggedProfile.objects.filter(
+ object_id=instance.id)
+ self.initial['desired_topic'] = TaggedProfile.objects.filter(
+ object_id=instance.id)
+
+ def save(self, commit=True):
+ model = super(ProfileEditForm, self).save(commit=False)
+ model.tags.set('interest', *self.cleaned_data['interest'])
+ model.tags.set('skill', *self.cleaned_data['skill'])
+ model.tags.set('desired_topic', *self.cleaned_data['desired_topic'])
+ if commit:
+ model.save()
+ return model
class Meta:
model = UserProfile
- fields = ('full_name', 'location', 'bio', 'preflang',)
+ fields = ('full_name', 'location', 'bio', 'preflang', 'interest')
widgets = {
'bio': CKEditorWidget(config_name='reduced'),
+ 'interest': CategoryTagWidget(category='interest')
}
def clean(self):
@@ -189,7 +240,6 @@ def clean(self):
class ProfileImageForm(forms.ModelForm):
-
class Meta:
model = UserProfile
fields = ('image',)
@@ -206,14 +256,12 @@ def clean_image(self):
class ProfileLinksForm(forms.ModelForm):
-
class Meta:
model = Link
fields = ('name', 'url', 'subscribe',)
class PasswordResetForm(auth_forms.PasswordResetForm):
-
def clean_email(self):
email = self.cleaned_data["email"]
self.users_cache = User.objects.filter(
View
59 apps/users/managers.py
@@ -0,0 +1,59 @@
+from taggit.utils import require_instance_manager
+from taggit.managers import TaggableManager, _TaggableManager
+
+
+class CategoryTaggableManager(TaggableManager):
+ def formfield(self, *args, **kwargs):
+ return None
+
+ def __get__(self, instance, model):
+ """Override ___get___ to return a slightly tweaked manager class"""
+ if instance is not None and instance.pk is None:
+ raise ValueError("%s objects need to have a primary key value "
+ "before you can access their tags." % model.__name__)
+ manager = _CategoryTaggableManager(
+ through=self.through, model=model, instance=instance
+ )
+ return manager
+
+
+class _CategoryTaggableManager(_TaggableManager):
+ @require_instance_manager
+ def add(self, category, *tags):
+ """This is the same as the _TaggableManager add, except it accepts a
+ category parameter."""
+ str_tags = set([
+ t
+ for t in tags
+ if not isinstance(t, self.through.tag_model())
+ ])
+ tag_objs = set(tags) - str_tags
+ # If str_tags has 0 elements Django actually optimizes that to not do a
+ # query. Malcolm is very smart.
+ existing = self.through.tag_model().objects.filter(
+ name__in=str_tags, category=category
+ )
+ tag_objs.update(existing)
+
+ for new_tag in str_tags - set(t.name for t in existing):
+ tag_objs.add(self.through.tag_model().objects.
+ create(name=new_tag, category=category))
+
+ for tag in tag_objs:
+ self.through.objects.get_or_create(
+ tag=tag, **self._lookup_kwargs())
+
+ @require_instance_manager
+ def set(self, category, *tags):
+ self.clear(category)
+ self.add(category, *tags)
+
+ @require_instance_manager
+ def remove(self, category, *tags):
+ self.through.objects.filter(**self._lookup_kwargs()).filter(
+ tag__name__in=tags, tag__category=category).delete()
+
+ @require_instance_manager
+ def clear(self, category):
+ self.through.objects.filter(**self._lookup_kwargs()).filter(
+ tag__category=category).delete()
View
97 apps/users/migrations/0012_auto__chg_field_profiletag_category.py
@@ -0,0 +1,97 @@
+# 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 'ProfileTag.category'
+ db.alter_column('users_profiletag', 'category', self.gf('django.db.models.fields.CharField')(max_length=50))
+
+
+ def backwards(self, orm):
+
+ # Changing field 'ProfileTag.category'
+ db.alter_column('users_profiletag', 'category', self.gf('django.db.models.fields.CharField')(max_length=10))
+
+
+ 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'})
+ },
+ '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'})
+ },
+ 'users.profiletag': {
+ 'Meta': {'object_name': 'ProfileTag', '_ormbases': ['taggit.Tag']},
+ 'category': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'tag_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['taggit.Tag']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'users.taggedprofile': {
+ 'Meta': {'object_name': 'TaggedProfile'},
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'users_taggedprofile_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': "'users_taggedprofile_items'", 'to': "orm['users.ProfileTag']"})
+ },
+ 'users.userprofile': {
+ 'Meta': {'object_name': 'UserProfile'},
+ 'bio': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
+ 'confirmation_code': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+ 'created_on': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'auto_now_add': 'True', 'blank': 'True'}),
+ 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'discard_welcome': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'unique': 'True', 'null': 'True'}),
+ 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'full_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'location': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+ 'newsletter': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'password': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255'}),
+ 'preflang': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '16'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'default': "''", 'unique': 'True', 'max_length': '255'})
+ }
+ }
+
+ complete_apps = ['users']
View
12 apps/users/models.py
@@ -19,6 +19,7 @@
from django.utils.safestring import mark_safe
from taggit.models import GenericTaggedItemBase, Tag
+from south.modelsinspector import add_ignored_fields
from drumbeat import storage
from drumbeat.utils import get_partition_id, safe_filename
@@ -27,11 +28,15 @@
from projects.models import Project, Participation
from users import tasks
from activity.schema import object_types
+from users.managers import CategoryTaggableManager
import caching.base
log = logging.getLogger(__name__)
+# To fix a South problem (Cannot freeze field 'users.userprofile.tags')
+add_ignored_fields(["^users\.managers"])
+
GRAVATAR_TEMPLATE = ("http://www.gravatar.com/avatar/%(gravatar_hash)s"
"?s=%(size)s&amp;d=%(default)s&amp;r=%(rating)s")
@@ -60,8 +65,9 @@ class ProfileTag(Tag):
CATEGORY_CHOICES = (
('skill', 'Skill'),
('interest', 'Interest'),
+ ('desired_topic', 'Desired Topics'),
)
- category = models.CharField(max_length=10, choices=CATEGORY_CHOICES)
+ category = models.CharField(max_length=50, choices=CATEGORY_CHOICES)
class TaggedProfile(GenericTaggedItemBase):
@@ -110,8 +116,8 @@ class UserProfile(ModelBase):
deleted = models.BooleanField(default=False)
user = models.ForeignKey(User, null=True, editable=False, blank=True)
- # TODO: enable when addition/edition of tags is implemented.
- # tags = TaggableManager(through=TaggedProfile)
+
+ tags = CategoryTaggableManager(through=TaggedProfile, blank=True)
objects = UserProfileManager()
View
4 apps/users/urls.py
@@ -42,7 +42,9 @@
# Public pages
- url(r'^people/', 'users.views.user_list',
+ url(r'^people/tag/(?P<tag_slug>[\w\-\. ]+)/$',
+ 'users.views.user_tagged_list', name="users_user_tagged_list"),
+ url(r'^people/$', 'users.views.user_list',
name='users_user_list'),
# Registration urls
View
22 apps/users/views.py
@@ -24,7 +24,7 @@
from l10n.urlresolvers import reverse
from urlparse import urlparse, urlunparse
from users import forms
-from users.models import UserProfile, create_profile
+from users.models import UserProfile, create_profile, ProfileTag
from users.fields import UsernameField
from users.decorators import anonymous_only, login_required
from users import drupal, badges
@@ -301,6 +301,16 @@ def user_list(request):
}, context_instance=RequestContext(request))
+def user_tagged_list(request, tag_slug):
+ """Display a list of users that are tagged with the tag and tag type. """
+ tag = get_object_or_404(ProfileTag, slug=tag_slug)
+ users = UserProfile.objects.filter(deleted=False, tags__slug=tag_slug)
+ return render_to_response('users/user_list.html', {
+ 'tagged': users,
+ 'tag': tag,
+ }, context_instance=RequestContext(request))
+
+
@anonymous_only
def confirm_registration(request, token, username):
"""Confirm a users registration."""
@@ -343,6 +353,10 @@ def profile_view(request, username):
current_projects = profile.get_current_projects(only_public=True)
following = profile.following()
followers = profile.followers()
+ skills = profile.tags.filter(category='skill').order_by('name')
+ interests = profile.tags.filter(category='interest').order_by('name')
+ desired_topics = profile.tags.filter(
+ category='desired_topic').order_by('name')
links = Link.objects.filter(user=profile,
project__isnull=True).order_by('index')
activities = Activity.objects.for_user(profile)
@@ -355,9 +369,9 @@ def profile_view(request, username):
'current_projects': current_projects,
'following': following,
'followers': followers,
- # TODO: enable when addition/edition of tags is implemented.
- # 'skills': profile.tags.filter(category='skill'),
- # 'interests': profile.tags.filter(category='interest'),
+ 'skills': skills,
+ 'interests': interests,
+ 'desired_topics': desired_topics,
'links': links,
'activities': activities,
'past_projects': past_projects,
View
BIN  locale/es/LC_MESSAGES/django.mo
Binary file not shown
View
252 locale/es/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: LERNANTA 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-07-02 18:06-0400\n"
+"POT-Creation-Date: 2011-07-03 17:42-0400\n"
"PO-Revision-Date: 2011-04-11 8:23-0500\n"
"Last-Translator: Vladimir Támara Patiño <vtamara@pasosdeJesus.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -75,7 +75,7 @@ msgid "Message restored!"
msgstr "¡Mensaje restaurado!"
#: apps/content/forms.py:22 apps/content/forms.py:38 apps/content/forms.py:54
-#: apps/content/forms.py:70 apps/content/forms.py:86 apps/users/forms.py:155
+#: apps/content/forms.py:70 apps/content/forms.py:86 apps/users/forms.py:156
msgid "This field is required."
msgstr "Este campo es requerido."
@@ -239,19 +239,19 @@ msgstr "Ocurrió un error al enviar el mensaje. Por favor intente nuevamente."
msgid "That email address is register under a different username."
msgstr "Ese correo está registrado bajo otro nombre de usuario."
-#: apps/preferences/forms.py:32 apps/users/forms.py:37
+#: apps/preferences/forms.py:32 apps/users/forms.py:39
msgid "Password must be at least 8 characters long "
msgstr "Las contraseñas deben tener al menos 8 caracteres "
-#: apps/preferences/forms.py:33 apps/users/forms.py:38
+#: apps/preferences/forms.py:33 apps/users/forms.py:40
msgid "and contain both numbers and letters."
msgstr "y contener tanto números como letras."
-#: apps/preferences/forms.py:38 apps/users/forms.py:43
+#: apps/preferences/forms.py:38 apps/users/forms.py:45
msgid "That password is too common. Please choose another."
msgstr "Esa contraseña es muy común. Por favor elija otra."
-#: apps/preferences/forms.py:69 apps/users/forms.py:168
+#: apps/preferences/forms.py:69 apps/users/forms.py:169
msgid "Passwords do not match."
msgstr "Las contraseñas no coinciden."
@@ -268,7 +268,7 @@ msgid "Password updated"
msgstr "Contraseña actualizada"
#: apps/preferences/views.py:97 apps/users/views.py:257
-#: apps/users/views.py:401
+#: apps/users/views.py:415
msgid "There are errors in this form. Please correct them and resubmit."
msgstr ""
"Hay errores en este formulario. Por favor corríjalos e intente nuevamente."
@@ -293,7 +293,7 @@ msgid "You are not participating in this %s"
msgstr "Usted no está participando en este %s"
#: apps/projects/forms.py:59 apps/schools/forms.py:41 apps/schools/forms.py:55
-#: apps/schools/forms.py:69 apps/schools/forms.py:83 apps/users/forms.py:203
+#: apps/schools/forms.py:69 apps/schools/forms.py:83 apps/users/forms.py:253
#, python-format
msgid "Image exceeds max image size: %(max)dk"
msgstr "La imagen excede el tamaño máximo: %(max)dk"
@@ -352,11 +352,11 @@ msgstr "grupo"
#: apps/projects/models.py:123
#, python-format
msgid "%(name)s %(kind)s"
-msgstr ""
+msgstr "%(kind)s %(name)s"
#: apps/projects/models.py:134
msgid "created"
-msgstr "creó el grupo de estudio"
+msgstr "creó"
#: apps/projects/views.py:99 apps/projects/views.py:212
#: apps/projects/views.py:293
@@ -416,7 +416,7 @@ msgid "There was an error adding your link."
msgstr "Ocurrió un error al añadir el enlace."
#: apps/projects/views.py:440 apps/projects/views.py:470
-#: apps/users/views.py:600
+#: apps/users/views.py:614
msgid "You can't edit this link"
msgstr "Usted no puede editar este enlace"
@@ -468,15 +468,15 @@ msgstr "¡%(user)s te está siguiendo en P2PU!"
msgid "%(user)s is following %(project)s on P2PU!"
msgstr "¡%(user)s está siguiendo %(project)s en P2PU!"
-#: apps/relationships/views.py:39
+#: apps/relationships/views.py:41
msgid "You are already following this study group"
msgstr "Ya está siguiendo a este grupo de estudio"
-#: apps/relationships/views.py:41
+#: apps/relationships/views.py:43
msgid "You are already following this user"
msgstr "Ya está siguiendo a este usuario"
-#: apps/relationships/views.py:55
+#: apps/relationships/views.py:57
msgid "You can't unfollow"
msgstr "Usted no puede dejar de seguir"
@@ -507,7 +507,7 @@ msgstr "El %(kind)s %(slug)s ya fue rechazado."
#: apps/schools/forms.py:176
#, python-format
msgid "The %(slug)s %(kind)s is already part of this school."
-msgstr "El %(kind)s %(slug)s es parte de esta escuela."
+msgstr "El %(kind)s %(slug)s ya es parte de esta escuela."
#: apps/schools/forms.py:180
#, python-format
@@ -591,59 +591,59 @@ msgstr "Usted ya entró a su cuenta."
msgid "Please choose another username."
msgstr "Por favor elija otro nombre de usuario."
-#: apps/users/forms.py:68
+#: apps/users/forms.py:69
msgid "This google openid is not supported. "
msgstr "Este openid de google no está soportado. "
-#: apps/users/forms.py:69
+#: apps/users/forms.py:70
msgid "Please use your google profile openid."
msgstr "Por favor use el openid de su profile de google."
-#: apps/users/forms.py:77
+#: apps/users/forms.py:78
msgid "Your account was migrated from the old P2PU website."
msgstr "Su cuenta fue migrada desde el sitio antiguo de P2PU."
-#: apps/users/forms.py:149
+#: apps/users/forms.py:150
msgid "User profile with this Username already exists."
msgstr "Ya existe un perfil con este nombre de usuario."
-#: apps/users/forms.py:158
+#: apps/users/forms.py:159
msgid "User profile with this Email already exists."
msgstr "Ya existe un perfil de usuario con este correo."
-#: apps/users/forms.py:224
+#: apps/users/forms.py:272
msgid "That e-mail address isn't associated to a user account. "
msgstr "La dirección de correo no tiene asociada una cuenta de usuario. "
-#: apps/users/forms.py:225
+#: apps/users/forms.py:273
msgid "Are you sure you've registered?"
-msgstr "¿Está seguro de que se registró?"
+msgstr "¿Está seguro de haberse registrado?"
-#: apps/users/forms.py:234
+#: apps/users/forms.py:282
msgid "You did not finish the registration proccess last time. "
msgstr "Usted no terminó de crear su cuenta la última vez."
-#: apps/users/forms.py:235
+#: apps/users/forms.py:283
msgid "Please register a new account."
msgstr "Por favor cree una nueva cuenta."
-#: apps/users/models.py:120
+#: apps/users/models.py:126
msgid "Anonym"
msgstr "Anónimo"
-#: apps/users/models.py:163
+#: apps/users/models.py:169
msgid "(organizing)"
msgstr "(organizando)"
-#: apps/users/models.py:166
+#: apps/users/models.py:172
msgid "(participating)"
msgstr "(participando)"
-#: apps/users/models.py:169
+#: apps/users/models.py:175
msgid "(following)"
msgstr "(siguiendo)"
-#: apps/users/models.py:210
+#: apps/users/models.py:216
msgid "Complete Registration"
msgstr "Termine de Crear su Cuenta"
@@ -677,7 +677,7 @@ msgstr "Contraseña, nombre de usuario, o correo incorrectos."
msgid "Congratulations! Your user account was successfully created."
msgstr "¡Felicitaciones! Su cuenta de usuario fue creada exitosamente."
-#: apps/users/views.py:250 apps/users/views.py:395
+#: apps/users/views.py:250 apps/users/views.py:409
msgid ""
"Thanks! We have sent an email to {0} with instructions for completing your "
"registration."
@@ -685,15 +685,15 @@ msgstr ""
"¡Gracias! Hemos enviado un correo a {0} con instrucciones para que termine "
"de crear su cuenta."
-#: apps/users/views.py:311
+#: apps/users/views.py:321
msgid "Hmm, that doesn't look like the correct confirmation code"
msgstr "Hmm, ese no parece un código de confirmación correcto"
-#: apps/users/views.py:316
+#: apps/users/views.py:326
msgid "Success! You have verified your account. You may now sign in."
msgstr "¡Éxito! Ya verificó su cuenta. Ahora puede entrar."
-#: apps/users/views.py:332
+#: apps/users/views.py:342
msgid ""
"A confirmation code has been sent to the email address associated with your "
"account."
@@ -701,15 +701,15 @@ msgstr ""
"Se ha enviado un código de confirmación la dirección de correo asociada a su "
"cuenta"
-#: apps/users/views.py:341
+#: apps/users/views.py:351
msgid "This user account was deleted."
msgstr "Esta cuenta de usuario fue borrada."
-#: apps/users/views.py:418
+#: apps/users/views.py:432
msgid "Profile updated"
msgstr "Perfil actualizado"
-#: apps/users/views.py:424
+#: apps/users/views.py:438
msgid ""
"There were problems updating your profile. Please correct the problems and "
"submit again."
@@ -717,68 +717,68 @@ msgstr ""
"Ocurrieron problemas al actualizar su perfil. Por favor corríja la "
"información e intente nuevamente."
-#: apps/users/views.py:459
+#: apps/users/views.py:473
#, python-format
msgid "The identity %s has already been claimed by you."
msgstr "La identidad %s ya ha sido reservada por usted."
-#: apps/users/views.py:460
+#: apps/users/views.py:474
#, python-format
msgid "The identity %s has already been claimed by another user."
msgstr "Otro usuario ya reservó la identidad %s."
-#: apps/users/views.py:473
+#: apps/users/views.py:487
#, python-format
msgid "The identity %s has been saved."
-msgstr "La identidad %s ha sido salvada."
+msgstr "La identidad %s ha sido guardada."
-#: apps/users/views.py:480
+#: apps/users/views.py:494
#, python-format
msgid "OpenID authentication failed: %s"
msgstr "Fallo en la autentificación con OpenID: %s"
-#: apps/users/views.py:483
+#: apps/users/views.py:497
msgid "Authentication cancelled."
msgstr "Autentificación cancelada."
-#: apps/users/views.py:486
+#: apps/users/views.py:500
#, python-format
msgid "Unknown OpenID response type: %r"
msgstr "Tipo de respuesta OpenID desconocido: %r"
-#: apps/users/views.py:488
+#: apps/users/views.py:502
msgid "This is an OpenID relying party endpoint."
msgstr "Esta url debe ser accedida por un proveedor de OpenID."
-#: apps/users/views.py:497
+#: apps/users/views.py:511
msgid "You can't edit this openid"
msgstr "Usted no puede editar este openid"
-#: apps/users/views.py:499
+#: apps/users/views.py:513
msgid "The openid was deleted."
msgstr "El openid fue removido."
-#: apps/users/views.py:529
+#: apps/users/views.py:543
msgid "Profile image updated"
msgstr "Imagen actualizada"
-#: apps/users/views.py:534
+#: apps/users/views.py:548
msgid "There was an error uploading your image."
msgstr "Ocurrió un error al subir la imagen."
-#: apps/users/views.py:546
+#: apps/users/views.py:560
msgid "Profile link added."
msgstr "Enlace añadido."
-#: apps/users/views.py:555
+#: apps/users/views.py:569
msgid "There was an error saving your link."
msgstr "Ocurrió un error al guardar el enlace."
-#: apps/users/views.py:579
+#: apps/users/views.py:593
msgid "Profile link updated"
msgstr "Enlace actualizado"
-#: apps/users/views.py:602
+#: apps/users/views.py:616
msgid "The link was deleted."
msgstr "El enlace fue eliminado."
@@ -791,7 +791,7 @@ msgid ""
"Oops. That links doesn't seem to work. Maybe the page you are looking for is "
"on the old p2pu site? Try "
msgstr ""
-"Oh! Ese enlace no parece funcionar. ¿Tal vez la página que está buscando "
+"¡Oh! Ese enlace no parece funcionar. ¿Tal vez la página que está buscando "
"está en el antiguo sitio de p2pu? Intente visitar "
#: templates/404.html:9
@@ -931,6 +931,10 @@ msgstr "css/style-es.css"
msgid "(more)"
msgstr "(más)"
+#: templates/base.html:45 templates/search/search.html:15
+msgid "Loading"
+msgstr "Cargando"
+
#: templates/base.html:59
msgid "BETA"
msgstr "BETA"
@@ -944,7 +948,9 @@ msgid "Learn"
msgstr "Aprender"
#: templates/base.html:63 templates/activity/base.html:20
-#: templates/projects/sidebar.html:130 templates/users/profile.html:16
+#: templates/projects/project_user_list.html:7
+#: templates/projects/project_user_list.html:12
+#: templates/projects/sidebar.html:131 templates/users/profile.html:16
#: templates/users/profile_edit.html:11 templates/users/user_list.html:5
#: templates/users/user_list.html.py:10
msgid "People"
@@ -996,7 +1002,7 @@ msgstr "Entrar"
#: templates/base.html:114
msgid "Home"
-msgstr ""
+msgstr "Inicio"
#: templates/base.html:156 templates/drumbeatmail/base.html:52
#: templates/projects/contact_organizers.html:49
@@ -1018,7 +1024,7 @@ msgstr "js/script-es.js"
#: templates/drumbeat/report_abuse.html:10
#: templates/drumbeat/report_received.html:10
#: templates/drumbeatmail/inbox.html:49 templates/drumbeatmail/inbox.html:96
-#: templates/projects/sidebar.html:51 templates/users/profile.html:81
+#: templates/projects/sidebar.html:51 templates/users/profile.html:93
msgid "Report Abuse"
msgstr "Reportar Abuso"
@@ -1362,6 +1368,10 @@ msgstr "Publicar Comentario"
#: templates/dashboard/dashboard.html:94 templates/dashboard/dashboard.html:96
#: templates/projects/directory.html:37 templates/projects/directory.html:39
#: templates/projects/project.html:77 templates/projects/project.html.py:79
+#: templates/projects/project_user_list.html:45
+#: templates/projects/project_user_list.html:47
+#: templates/projects/project_user_list.html:72
+#: templates/projects/project_user_list.html:74
msgid "previous"
msgstr "anterior"
@@ -1371,6 +1381,10 @@ msgstr "anterior"
#: templates/dashboard/dashboard.html:101 templates/projects/directory.html:42
#: templates/projects/directory.html:44 templates/projects/project.html:82
#: templates/projects/project.html.py:84
+#: templates/projects/project_user_list.html:50
+#: templates/projects/project_user_list.html:52
+#: templates/projects/project_user_list.html:77
+#: templates/projects/project_user_list.html:79
msgid "next"
msgstr "siguiente"
@@ -1499,17 +1513,18 @@ msgstr "imagén del perfil de %(user)s"
#: templates/dashboard/dashboard.html:30
#: templates/projects/_project_card.html:31
+#: templates/projects/project_user_list.html:61
#: templates/projects/sidebar.html:115 templates/users/_user_card.html:12
-#: templates/users/profile.html:87
+#: templates/users/profile.html:99
msgid "Followers"
msgstr "Seguidores"
#: templates/dashboard/dashboard.html:36 templates/users/_user_card.html:16
-#: templates/users/profile.html:93
+#: templates/users/profile.html:105
msgid "Following"
msgstr "Siguiendo"
-#: templates/dashboard/dashboard.html:43 templates/users/profile.html:100
+#: templates/dashboard/dashboard.html:43 templates/users/profile.html:112
msgid "Learning"
msgstr "Aprendiendo"
@@ -1574,7 +1589,7 @@ msgstr "Busque Grupos y Cursos"
msgid "Start Your Own"
msgstr "Inicie el Suyo Propio"
-#: templates/dashboard/splash.html:22
+#: templates/dashboard/splash.html:21
msgid ""
"We are an <em class=\"highlight1\">online</em><br>community that<br><em "
"class=\"highlight2\">enables learning</em>. <em class=\"highlight3\">So</em>"
@@ -1583,11 +1598,11 @@ msgstr ""
"línea</em> que <em class=\"highlight2\">posibilita<br> el aprendizaje</em>, "
"&nbsp;&nbsp;<em class=\"highlight3\" align=\"right\">así que</em></div>"
-#: templates/dashboard/splash.html:23
+#: templates/dashboard/splash.html:22
msgid "At"
msgstr "En"
-#: templates/dashboard/splash.html:23
+#: templates/dashboard/splash.html:22
msgid ""
"people work together to learn a particular topic by completing tasks, "
"assessing individual and group work, and providing constructive feedback."
@@ -1596,22 +1611,22 @@ msgstr ""
"tareas, evaluar el trabajo individual y colectivo y brindar "
"retroalimentación constructiva."
-#: templates/dashboard/splash.html:37 templates/projects/_project_list.html:5
+#: templates/dashboard/splash.html:35 templates/projects/_project_list.html:5
#: templates/schools/school_edit.html:23
#: templates/schools/school_edit_featured.html:7
-#: templates/users/user_list.html:18
+#: templates/users/user_list.html:30
msgid "Featured"
msgstr "Destacado"
-#: templates/dashboard/splash.html:47
+#: templates/dashboard/splash.html:45
msgid "P2PU Blog"
msgstr "Blog de P2PU"
-#: templates/dashboard/splash.html:47
+#: templates/dashboard/splash.html:45
msgid "Subscribe to the Peer 2 Peer University blog"
msgstr "Suscribirse al blog de Peer 2 Peer University"
-#: templates/dashboard/splash.html:47
+#: templates/dashboard/splash.html:45
msgid "feed"
msgstr "alimentador"
@@ -1745,6 +1760,7 @@ msgstr "Actualizaciones"
#: templates/projects/_project_card.html:27
#: templates/projects/project_edit.html:48
#: templates/projects/project_edit_participants.html:7
+#: templates/projects/project_user_list.html:34
#: templates/projects/sidebar.html:111
msgid "Participants"
msgstr "Participantes"
@@ -1865,7 +1881,7 @@ msgstr "Tarea de Inscripción"
#: templates/projects/project.html:21
#: templates/projects/project_task_list.html:21
-#: templates/projects/sidebar.html:164
+#: templates/projects/sidebar.html:166
msgid "Tasks"
msgstr "Tareas"
@@ -2226,10 +2242,15 @@ msgid "Import"
msgstr "Importar"
#: templates/projects/project_task_list.html:35
-#: templates/projects/sidebar.html:183
+#: templates/projects/sidebar.html:185
msgid "No tasks have been added."
msgstr "Ninguna tarea ha sido añadida."
+#: templates/projects/project_user_list.html:22
+#: templates/projects/sidebar.html:107
+msgid "Organizers"
+msgstr "Organizadores"
+
#: templates/projects/sidebar.html:19 templates/users/profile.html:40
msgid "Unfollow"
msgstr "Dejar de Seguir"
@@ -2274,47 +2295,47 @@ msgstr "Cerrada"
msgid "Open"
msgstr "Abierta"
-#: templates/projects/sidebar.html:107
-msgid "Organizers"
-msgstr "Organizadores"
-
#: templates/projects/sidebar.html:120
msgid "Pending Applicants"
msgstr "Aspirantes Pendientes:"
-#: templates/projects/sidebar.html:146
+#: templates/projects/sidebar.html:130
+msgid "See All"
+msgstr "Ver Todos"
+
+#: templates/projects/sidebar.html:148
msgid "Closed Sign-up"
msgstr "Inscripción Cerrada"
-#: templates/projects/sidebar.html:148
+#: templates/projects/sidebar.html:150
msgid "Sign-up in Progress"
msgstr "Inscripción en Progreso"
-#: templates/projects/sidebar.html:150
+#: templates/projects/sidebar.html:152
msgid "Your Answer"
msgstr "Su Respuesta"
-#: templates/projects/sidebar.html:155
+#: templates/projects/sidebar.html:157
msgid "Edit Participants"
msgstr "Editar Participantes"
-#: templates/projects/sidebar.html:157
+#: templates/projects/sidebar.html:159
msgid "Contact Organizer"
msgstr "Contactar Organizador"
-#: templates/projects/sidebar.html:188
+#: templates/projects/sidebar.html:190
msgid "New Task"
msgstr "Nueva Tarea"
-#: templates/projects/sidebar.html:194
+#: templates/projects/sidebar.html:196
msgid "External Links"
msgstr "Enlaces Externos"
-#: templates/projects/sidebar.html:212
+#: templates/projects/sidebar.html:214
msgid "No external links have been added."
msgstr "Ningún enlace externo ha sido añadido."
-#: templates/projects/sidebar.html:217
+#: templates/projects/sidebar.html:219
msgid "Edit Links"
msgstr "Editar Enlaces"
@@ -2470,7 +2491,7 @@ msgstr "Logo del Sitio"
#: templates/schools/school_edit.html:24
#: templates/schools/school_edit_membership.html:7
msgid "Membership"
-msgstr ""
+msgstr "Membresía"
#: templates/schools/school_edit_background.html:12
msgid "Replace School Background Image"
@@ -2540,7 +2561,7 @@ msgstr ""
#: templates/schools/school_edit_membership.html:8
msgid "View, add and remove study groups, courses, ... to this school."
-msgstr "Ver, añadir y remover grupos de estudio, cursos, ... de esta escuela."
+msgstr "Ver, añadir y retirar grupos de estudio, cursos, ... de esta escuela."
#: templates/schools/school_edit_organizers.html:8
msgid "View, add and remove organizers of your school."
@@ -2746,6 +2767,26 @@ msgstr "Idioma Preferido"
msgid "About Me"
msgstr "Acerca de Mi"
+#: templates/users/_profile_edit.html:21
+msgid ""
+"Please describe your skills, interest, and the things you will want to "
+"learn, by providing a comma-separated list of tags."
+msgstr ""
+"Por favor, describa sus habilidades, intereses y las cosas que desea "
+"aprender, mediante una lista de etiquetas separadas por comas."
+
+#: templates/users/_profile_edit.html:23
+msgid "Skilled in"
+msgstr "Hábil en"
+
+#: templates/users/_profile_edit.html:28
+msgid "Interested in"
+msgstr "Interesado en"
+
+#: templates/users/_profile_edit.html:33 templates/users/profile.html:83
+msgid "Want to learn more about"
+msgstr "Quiero aprender más sobre"
+
#: templates/users/_profile_edit_image.html:1
msgid "Current Profile Image"
msgstr "Imagen del Perfil Actual"
@@ -2856,23 +2897,39 @@ msgstr "Actividad que el usuario está siguiendo"
msgid "Private Message"
msgstr "Mensaje Privado"
-#: templates/users/profile.html:68 templates/users/profile.html.py:75
-msgid "See more about "
-msgstr "Ver más sobre "
+#: templates/users/profile.html:67
+msgid "Skills"
+msgstr "Habilidades"
-#: templates/users/profile.html:114
+#: templates/users/profile.html:69
+msgid "View more with skills in "
+msgstr "Ver más habilidades en "
+
+#: templates/users/profile.html:74
+msgid "Interests"
+msgstr "Intereses"
+
+#: templates/users/profile.html:77
+msgid "View more interested in "
+msgstr "Ver más intereses en "
+
+#: templates/users/profile.html:86
+msgid "View more interested in learning more about "
+msgstr "Ver más sobre que está interesado en aprender "
+
+#: templates/users/profile.html:126
msgid "Past Involvement"
msgstr "Participación Anterior"
-#: templates/users/profile.html:133
+#: templates/users/profile.html:145
msgid "Badges"
msgstr "Insignias"
-#: templates/users/profile.html:151
+#: templates/users/profile.html:163
msgid "(UP)"
msgstr "(ARRIBA)"
-#: templates/users/profile.html:152
+#: templates/users/profile.html:164
msgid "(DOWN)"
msgstr "(ABAJO)"
@@ -3101,7 +3158,8 @@ msgid ""
"You can login directly with your username and password from the old P2PU "
"website."
msgstr ""
-"Puede entrar directamente con su nombre de usuario y contraseña de p2pu.org."
+"Puede entrar directamente con su nombre de usuario y contraseña del antiguo "
+"sitio web de P2PU."
#: templates/users/signin.html:16
msgid "Username or Email"
@@ -3119,11 +3177,15 @@ msgstr "o usar"
msgid "Browse <b>People</b>"
msgstr "Lista de <b>Personas</b>"
-#: templates/users/user_list.html:28
+#: templates/users/user_list.html:19
+msgid "in"
+msgstr "en"
+
+#: templates/users/user_list.html:40
msgid "Active this Week"
msgstr "Activos esta Semana"
-#: templates/users/user_list.html:39
+#: templates/users/user_list.html:51
msgid "New People"
msgstr "Nuevas"
View
41 media/css/batucada.css
@@ -591,7 +591,7 @@ header {}
#project_landing #breadcrumbs, #page #breadcrumbs, #edit_page #breadcrumbs, #comment #breadcrumbs, #delete_page #breadcrumbs,
#delete_restore_comment #breadcrumbs, #project_edit #breadcrumbs, #create_page #breadcrumbs, #sign_up_task #breadcrumbs,
- #sign_up_comment #breadcrumbs {
+ #sign_up_comment #breadcrumbs, #project_user_list #breadcrumbs {
height: 6em;
}
@@ -1079,6 +1079,19 @@ header {}
.card-list .card dt{
color: #919191;
}
+
+
+#project_user_list .card-list .user-list li{
+ width: 190px;
+ margin-right: 8px;
+}
+#project_user_list .card-list .user.card h1 {
+ width: 100px;
+}
+
+#project_user_list .card-list .card dl.updates {
+ width: 30%;
+}
#main {
@@ -2764,43 +2777,43 @@ footer {
* brian@nyhacker.org
*/
-footer[role="main"] ul {
+footer[class="main"] ul {
margin-left: 104px;
padding-bottom: 50px;
float: left;
}
-footer[role="main"] ul:first-child {
+footer[class="main"] ul:first-child {
margin-left: 0px;
}
-footer[role="main"] ul > li:first-child {
+footer[class="main"] ul > li:first-child {
font-weight: normal;
font-size: 17px;
background-color: #fff;
line-height: 40px;
padding: 0 8px;
}
-footer[role="main"] ul li {
+footer[class="main"] ul li {
margin: 0 0 8px;
}
-footer[role="main"] ul li a {
+footer[class="main"] ul li a {
font-size: 15px;
padding: 0 8px;
}
-footer[role="main"] ul[role="about-us"] > li a {
+footer[class="main"] ul[class="about-us"] > li a {
background-color: #cef200;
}
-footer[role="main"] ul[role="contact-us"] > li a {
+footer[class="main"] ul[class="contact-us"] > li a {
background-color: #4cebe2;
}
-footer[role="main"] ul[role="license-info"] > li a {
+footer[class="main"] ul[class="license-info"] > li a {
background-color: #ffde00;
}
-footer[role="main"] ul[role="cc"] {
+footer[class="main"] ul[class="cc"] {
line-height: 30px;
font-size: 15px;
}
-footer[role="main"] ul[role="cc"] li[role="icons"] a {
+footer[class="main"] ul[class="cc"] li[class="icons"] a {
display: block;
background: url('/media/images/cc-icons.png') no-repeat;
height: 65px;
@@ -2810,7 +2823,7 @@ footer[role="main"] ul[role="cc"] li[role="icons"] a {
text-indent: -999em;
}
-footer[role="main"] ul[role="supporters"] {
+footer[class="main"] ul[class="supporters"] {
margin-left: 20px;
margin-top: -65px;
text-align: center;
@@ -2818,7 +2831,7 @@ footer[role="main"] ul[role="supporters"] {
font-size: 15px;
}
-footer[role="main"] ul[role="supporters"] li[role="hewlett"] a {
+footer[class="main"] ul[class="supporters"] li[class="hewlett"] a {
display: block;
background: url('/media/images/hewlett-logo-white.png') no-repeat;
height: 53px;
@@ -2829,7 +2842,7 @@ footer[role="main"] ul[role="supporters"] li[role="hewlett"] a {
margin-left: 0px;
}
-footer[role="main"] ul[role="supporters"] li[role="shuttleworth"] a {
+footer[class="main"] ul[class="supporters"] li[class="shuttleworth"] a {
display: block;
background: url('/media/images/shuttleworth-funded-small.png') no-repeat;
height: 53px;
View
11 media/css/style-es.css
@@ -12,8 +12,17 @@
padding: 4px 6px 8px 0px;
}
-footer[role="main"] ul {
+footer[class="main"] ul {
float: left;
margin-left: 39px;
padding-bottom: 50px;
}
+
+footer[class="main"] ul[class="supporters"] {
+ font-size: 15px;
+ margin-left: 240px;
+ margin-top: -65px;
+ text-align: center;
+ width: 360px;
+}
+
View
24 templates/_footer.html
@@ -1,19 +1,19 @@
{% load l10n_tags %}
<br><br><br><br>
- <footer role="main">
- <div role="container">
+ <footer class="main">
+ <div class="container">
<nav>
- <ul role="about-us">
+ <ul class="about-us">
<li>{{ _('About Us') }}</li>
<li><a href="{% locale_url static_page_show 'about' %}">{{ _('About P2PU') }}</a></li>
<li><a href="http://blogs.p2pu.org/" target="_blank">{{ _('Blog') }}</a></li>
<li><a href="http://groups.google.com/group/p2pu-announce" target="_blank">{{ _('Announcements') }}</a></li>
<li><a href="{% locale_url static_page_show 'get-involved' %}">{{ _('Get Involved') }}</a></li>
<li><a href="http://wiki.p2pu.org" target="_blank">{{ _('Wiki') }}</a></li>
- <li><a href="http://archive.p2pu.org">{{ _('Old P2PU Site') }}</li></a>
+ <li><a href="http://archive.p2pu.org">{{ _('Old P2PU Site') }}</a></li>
</ul>
- <ul role="contact-us">
+ <ul class="contact-us">
<li>{{ _('Contact Us') }}</li>
<li><a href="{% locale_url static_page_show 'contact-us' %}">{{ _('Email') }}</a></li>
<li><a href="http://www.facebook.com/P2PUniversity" target="_blank">{{ _('Facebook') }}</a></li>
@@ -22,21 +22,21 @@
<li><a href="http://p2pu.lighthouseapp.com/projects/71002-lernanta/" target="_blank">{{ _('Found a Bug?') }}</a></li>
</ul>
- <ul role="license-info">
+ <ul class="license-info">
<li>{{ _('License Info') }}</li>
<li><a href="{% locale_url static_page_show 'license' %}">{{ _('License') }}</a></li>
<li><a href="{% locale_url static_page_show 'privacy' %}">{{ _('Privacy Guidelines') }}</a></li>
<li><a href="{% locale_url static_page_show 'terms-of-use' %}">{{ _('Terms of Use') }}</a></li>
</ul>
- <ul role="cc">
- <li><a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/" rel="license" target="_blank">{{ _('Creative Commons BY SA') }}</a></li>
- <li role="icons"><a href="http://creativecommons.org/licenses/by-sa/3.0/" rel="license" target="_blank">{{ _('CC BY SA') }}</a></li>
+ <ul class="cc">
+ <li><a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/" target="_blank">{{ _('Creative Commons BY SA') }}</a></li>
+ <li class="icons"><a href="http://creativecommons.org/licenses/by-sa/3.0/" rel="license" target="_blank">{{ _('CC BY SA') }}</a></li>
</ul>
- <ul role="supporters">
+ <ul class="supporters">
<li><a href="{% locale_url static_page_show 'supporters' %}">{{ _('Supporters') }}</a></li>
- <li role="hewlett"><a href="http://www.hewlett.org/" target="_blank">{{ _('The Hewlett Foundation') }}</a></li>
- <li role="shuttleworth"><a href="http://www.shuttleworthfoundation.org/" target="_blank">{{ _('The Shuttleworth Foundation') }}</a></li>
+ <li class="hewlett"><a href="http://www.hewlett.org/" target="_blank">{{ _('The Hewlett Foundation') }}</a></li>
+ <li class="shuttleworth"><a href="http://www.shuttleworthfoundation.org/" target="_blank">{{ _('The Shuttleworth Foundation') }}</a></li>
</ul>
</nav>
View
2  templates/activity/_activity_resource.html
@@ -10,7 +10,7 @@
{% endif %}
{% endif %}
<a href="{{ activity.actor.get_absolute_url }}">
- <img class="member-picture" width="54" height="54" src="{{ activity.actor.image_or_default }}">
+ <img class="member-picture" width="54" height="54" src="{{ activity.actor.image_or_default }}" alt="{{ activity.actor }}">
</a>
<div class="post-contents">
View
10 templates/base.html
@@ -8,7 +8,7 @@
<!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]-->
<head>
<meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <!--[if IE]><meta content='IE=8' http-equiv='X-UA-Compatible'/><![endif]-->
<title>P2PU (beta) | {% block title %}{% endblock %}</title>
<meta name="description" content="{{ _('Learning for everyone, by everyone, about almost anything.') }}">
@@ -42,7 +42,7 @@
<a href="https://github.com/p2pu/lernanta/wiki/Translating-Lernanta" target="_blank">{{ _('(more)') }}</a>
</nav>
- <div id="cse-search-form" style="width: 100%;">Loading</div>
+ <div id="cse-search-form" style="width: 100%;">{{ _('Loading') }}</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
google.load('search', '1', {language : 'en'});
@@ -80,9 +80,9 @@
<a href="#" id="user-link" class="top-level">
{# todo - come up with something better than image_or_default as profile isn't guaranteed to exist. #}
{% if user.get_profile %}
- <img id="user-picture" src="{{ user.get_profile.image_or_default }}" height="19" width="19">
+ <img id="user-picture" src="{{ user.get_profile.image_or_default }}" height="19" width="19" alt="{{ user.get_profile }}">
{% else %}
- <img id="user-picture" src="{{ MEDIA_URL }}images/member-missing.png" height="19" width="19">
+ <img id="user-picture" src="{{ MEDIA_URL }}images/member-missing.png" height="19" width="19" alt="{{ user.get_profile }}">
{% endif %}
<span>{{ _('My P2PU') }}</span>
{% if messages_inbox_count > 0 %}
@@ -95,7 +95,7 @@
<li><a href="{{ user.get_profile.get_absolute_url }}" class="sub-level">{{ _('View Profile') }}</a></li>
<li><a href="{% locale_url users_profile_edit %}" class="sub-level">{{ _('Edit Profile') }}</a></li>
<li><a href="{% locale_url drumbeatmail_inbox %}" class="sub-level">{{ _('Inbox') }} {% if messages_inbox_count > 0 %}<span id="inbox-count" class="new-messages">{{ messages_inbox_count }}</span>{% endif %}</a></li>
- <li><a href="{% locale_url users_logout %}"class="sub-level">{{ _('Logout') }}</a></li>
+ <li><a href="{% locale_url users_logout %}" class="sub-level">{{ _('Logout') }}</a></li>
</ul>
</li> <!-- /#user -->
</ul>
View
2  templates/dashboard/dashboard.html
@@ -17,7 +17,7 @@
<div id="sidebar">
<div class="vcard panel">
- <img class="member-picture" src="{{ user.get_profile.image_or_default }}" height="40" width="40" 'alt="{% blocktrans with user=user.username%}{{ user }}'s profile picture{% endblocktrans %}">
+ <img class="member-picture" src="{{ user.get_profile.image_or_default }}" height="40" width="40" alt="{% blocktrans with user=user.username%}{{ user }}'s profile picture{% endblocktrans %}">
<div class="member-details">
<h2 class="member-name">
<span class="fn">{{ user.get_profile }}</span>
View
2  templates/dashboard/splash.html
@@ -18,10 +18,8 @@
<a href="{% locale_url projects_gallery %}" class="big-find-course">{{ _('Browse Groups & Courses') }}</a>
<a href="{% locale_url projects_create %}" class="big-run-course">{{ _('Start Your Own') }}</a>
</nav>
- <hgroup>
<h1>{{ _('We are an <em class="highlight1">online</em><br>community that<br><em class="highlight2">enables learning</em>. <em class="highlight3">So</em>') }}</h1>
<p>{{ _('At') }} <em class="highlight3">P</em><em class="highlight1">2</em><em class="highlight2">P</em><em class="highlight4">U</em>, {{ _('people work together to learn a particular topic by completing tasks, assessing individual and group work, and providing constructive feedback.') }}</p>
- </hgroup>
</div>
</header> <!-- /#intro -->
<section id="main">
View
86 templates/projects/project_user_list.html
@@ -0,0 +1,86 @@
+{% extends "projects/base.html" %}
+
+{% load l10n_tags %}
+{% load project_tags %}
+
+
+{% block title %}{{ _('People') }}{% endblock %}
+
+{% block bodyid %}project_user_list{% endblock %}
+{% block project_breadcrumbs %}
+ <span class="arrow">&rsaquo;</span>
+ <a href="{% locale_url projects_user_list slug=project.slug %}">{{ _('People') }}</a>
+{% endblock %}
+
+{% block body %}
+{% sidebar %}
+
+<div id="main" class="card-list">
+<br><br>
+{% if organizers %}
+<section id="organizers">
+ <h1><span>{{ _('Organizers') }}</span></h1>
+ <ul class="user-list">
+ {% for participation in organizers %}
+ {% with person=participation.user %}
+ <li>{% include "users/_user_card.html" %}</li>
+ {% endwith %}
+ {% endfor %}
+ </ul>
+</section>
+{% endif %}
+{% if participants %}
+ <section id="participants">
+ <h1><span>{{ _('Participants') }}</span></h1>
+ <ul class="user-list">
+ {% for participation in participants %}
+ {% with person=participation.user %}
+ <li>{% include "users/_user_card.html" %}</li>
+ {% endwith %}
+ {% endfor %}
+ </ul>
+
+<div class="pagination">
+ {% if participants_page.has_previous %}
+ <a class="btn" href="{% locale_url projects_user_list slug=project.slug participants_page=participants_prev_page followers_page=followers_page_num %}">← {{ _('previous') }}</a>
+ {% else %}
+ <span class="btn">← {{ _('previous') }}</span>
+ {% endif %}
+ {% if participants_page.has_next %}
+ <a class="btn" href="{% locale_url projects_user_list slug=project.slug participants_page=participants_next_page followers_page=followers_page_num %}">{{ _('next') }} →</a>
+ {% else %}
+ <span class="btn">{{_('next')}} →</span>
+ {% endif %}
+</div>
+
+</section>
+{% endif %}
+
+{% if followers %}
+<section id="followers">
+ <h1><span>{{ _('Followers') }}</span></h1>
+ <ul class="user-list">
+ {% for relationship in followers %}
+ {% with person=relationship.source %}
+ <li>{% include "users/_user_card.html" %}</li>
+ {% endwith %}
+ {% endfor %}
+ </ul>
+
+<div class="pagination">
+ {% if followers_page.has_previous %}
+ <a class="btn" href="{% locale_url projects_user_list slug=project.slug participants_page=participants_page_num followers_page=followers_prev_page %}">← {{ _('previous') }}</a>
+ {% else %}
+ <span class="btn">← {{ _('previous') }}</span>
+ {% endif %}
+ {% if followers_page.has_next %}
+ <a class="btn" href="{% locale_url projects_user_list slug=project.slug participants_page=participants_page_num followers_page=followers_next_page %}">{{ _('next') }} →</a>
+ {% else %}
+ <span class="btn">{{_('next')}} →</span>
+ {% endif %}
+</div>
+
+</section>
+{% endif %}
+</div>
+{% endblock %}
View
8 templates/projects/sidebar.html
@@ -127,18 +127,20 @@
</section>
<section id="people" class="panel">
+ <a id="more_task_link" style="float:right" href="{% locale_url projects_user_list slug=project.slug %}">{{_('See All')}} »</a>
<h2 class="school_header">{{ _('People') }}</h2>
<br>
- {% for organizer in project.organizers %}
+ {% for organizer in sidebar_organizers %}
<a href="{{ organizer.user.get_absolute_url }}" title="{{ organizer.user }} (organizer)"><img class="member-picture" src="{{ organizer.user.image_or_default }}" height="26" width="26" alt="{{ organizer.user }} (organizer)"></a>
{% endfor %}
- {% for participant in project.non_organizer_participants %}
+ {% for participant in sidebar_participants %}
<a href="{{ participant.user.get_absolute_url }}" title="{{ participant.user }} (participant)"><img class="member-picture" src="{{ participant.user.image_or_default }}" height="26" width="26" alt="{{ participant.user }} (participant)"></a>
{% endfor %}
- {% for follower in project.non_participant_followers %}
+ {% for follower in sidebar_followers %}
<a href="{{ follower.source.get_absolute_url }}" title="{{ follower.source }} (follower)">
<img class="member-picture" src="{{ follower.source.image_or_default }}" height="26" width="26" alt="{{ follower.source }} (follower)"></a>
{% endfor %}
+
<br><br>
{% if user.is_authenticated and not organizing and not participating %}
{% if pending_signup %}
View
2  templates/search/search.html
@@ -12,7 +12,7 @@
{% block body %}
-<div id="cse" style="width: 100%;">Loading</div>
+<div id="cse" style="width: 100%;">{{ _('Loading') }}</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
function parseQueryFromUrl () {
View
16 templates/users/_profile_edit.html
@@ -18,3 +18,19 @@
{{ profile_form.bio }}
{{ profile_form.bio.errors }}
</div>
+<p>{{ _('Please describe your skills, interest, and the things you will want to learn, by providing a comma-separated list of tags.') }}</p>
+ <div class="field{% if profile_form.skill.errors %} error{% endif %}">
+ <label for="id_skill">{{ _('Skilled in') }}</label>
+ {{ profile_form.skill }}
+ {{ profile_form.skill.errors }}
+ </div>
+ <div class="field{% if profile_form.interest.errors %} error{% endif %}">
+ <label for="id_interest">{{ _('Interested in') }}</label>
+ {{ profile_form.interest }}
+ {{ profile_form.interest.errors }}
+ </div>
+ <div class="field{% if profile_form.desired_topic.errors %} error{% endif %}">
+ <label for="id_desired_topic">{{ _('Want to learn more about') }}</label>
+ {{ profile_form.desired_topic }}
+ {{ profile_form.desired_topic.errors }}
+ </div>
View
2  templates/users/_user_card.html
@@ -2,7 +2,7 @@
<article class="user vcard card">
<figure>
<a href="{{ person.get_absolute_url }}">
- <img class="member-picture" src="{{ person.image_or_default }}" height="54" width="54">
+ <img class="member-picture" src="{{ person.image_or_default }}" height="54" width="54" alt="{{ person }}">
</a>
</figure>
<h1 class="fn"><a href="{{ person.get_absolute_url }}">{{ person }}</a></h1>
View
20 templates/users/profile.html
@@ -26,7 +26,7 @@
{% block body %}
<div id="sidebar">
<div class="vcard panel">
- <img class="member-picture" src="{{ profile.image_or_default }}" height="54" width="54">
+ <img class="member-picture" src="{{ profile.image_or_default }}" height="54" width="54" alt="{{ profile }}">
<div class="member-details">
<h1 class="member-name">
<span class="fn">{{ profile }}</span>
@@ -55,7 +55,7 @@ <h1 class="member-name">
{{ profile.bio|nofollow|safe }}
</div>
- {% if profile.location %}
+ {% if profile.location %}
<dl class="member-location">
<dt>{{ _('Location:') }}</dt>
<dd class="adr">{{ profile.location }}</dd>
@@ -64,18 +64,30 @@ <h1 class="member-name">
{% if skills %}
<ul class="tags skills">
+ <h3>{{ _('Skills') }}</h3>
{% for skill in skills %}
- <li><a href="#" title="{{ _('See more about ') }}{{ skill.name }}">{{ skill.name }}</a></li>
+ <li><a href="{% locale_url users_user_tagged_list skill.slug %}" title="{{ _('View more with skills in ') }}{{ skill.name }}">{{ skill.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
{% if interests %}
+ <h3>{{ _('Interests') }}</h3>
<ul class="tags interests">
{% for interest in interests %}
- <li><a href="#" title="{{ _('See more about ') }}{{ interest.name }}">{{ interest.name }}</a></li>
+ <li><a href="{% locale_url users_user_tagged_list interest.slug %}" title="{{ _('View more interested in ') }}{{ interest.name }}">{{ interest.name }}</a></li>
{% endfor %}
</ul>
{% endif %}
+
+ {% if desired_topics %}
+ <h3>{{ _('Want to learn more about') }}</h3>
+ <ul class="tags interests">
+ {% for topic in desired_topics %}
+ <li><a href="{% locale_url users_user_tagged_list topic.slug %}" title="{{ _('View more interested in learning more about ') }}{{ topic.name }}">{{ topic.name }}</a></li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+
{% if user.is_authenticated and user != profile.user %}
<p class="supplemental_actions">
<a class="report abuse action" href="{% locale_url drumbeat_abuse model="userprofile" app_label="users" pk=profile.id %}">{{_('Report Abuse')}}</a>
View
12 templates/users/user_list.html
@@ -13,6 +13,18 @@
{% block body %}
<div id="main">
<h1>{{ _('Browse <b>People</b>') }}</h1>
+
+{% if tagged %}
+<section id="featured_users">
+ <h1><span>{{ tag.get_category_display }} {{ _('in') }} {{ tag.name }}</span></h1>
+ <ul class="user-list">
+ {% for person in tagged %}
+ <li>{% include "users/_user_card.html" %}</li>
+ {% endfor %}
+ </ul>
+</section>
+{% endif %}
+
{% if featured %}
<section id="featured_users">
<h1><span>{{ _('Featured') }}</span></h1>
Please sign in to comment.
Something went wrong with that request. Please try again.