Commit 565f50f577534830862fee996b532b2f7444a113

Authored by Adabriand Furtado
1 parent d7359554
Exists in master

Versão inicial da lógica de perfis.

alembic/versions/2dcee6dfae9d_create_profile_table.py 0 → 100644
... ... @@ -0,0 +1,48 @@
  1 +"""create profile table
  2 +
  3 +Revision ID: 2dcee6dfae9d
  4 +Revises: 4f12d8650050
  5 +Create Date: 2016-05-24 14:30:22.687206
  6 +
  7 +"""
  8 +
  9 +# revision identifiers, used by Alembic.
  10 +revision = '2dcee6dfae9d'
  11 +down_revision = '4f12d8650050'
  12 +
  13 +from alembic import op
  14 +import sqlalchemy as sa
  15 +from sqlalchemy.dialects.postgresql import ARRAY
  16 +import datetime
  17 +
  18 +
  19 +def make_timestamp():
  20 + now = datetime.datetime.utcnow()
  21 + return now.isoformat()
  22 +
  23 +
  24 +def upgrade():
  25 + op.create_table(
  26 + 'profile',
  27 + sa.Column('id', sa.Integer, primary_key=True),
  28 + sa.Column('name', sa.Text, nullable=False, unique=True),
  29 + sa.Column('description', sa.Text, nullable=False),
  30 + sa.Column('access', ARRAY(sa.Text), nullable=False),
  31 + sa.Column('created', sa.Text, server_default=make_timestamp()),
  32 + )
  33 +
  34 + # Add two categories
  35 + query = 'INSERT INTO profile (name, description, access) VALUES (\'Colaborador\', \'Colaborador geral\', \'{wikilibras}\')'
  36 + op.execute(query)
  37 + query = 'INSERT INTO profile (name, description, access) VALUES (\'Animador\', \'Animador 3D\', \'{wikilibras, corretor_sinais}\')'
  38 + op.execute(query)
  39 + query = 'INSERT INTO profile (name, description, access) VALUES (\'Especialista\', \'Especialista em LIBRAS\', \'{wikilibras, validador_sinais}\')'
  40 + op.execute(query)
  41 +
  42 + op.add_column('user', sa.Column('profile_id', sa.Integer, sa.ForeignKey('profile.id'), server_default="1"))
  43 +
  44 +
  45 +def downgrade():
  46 + op.drop_column('user', 'profile_id')
  47 + op.drop_table('profile')
  48 +
0 49 \ No newline at end of file
... ...
pybossa/forms/forms.py
... ... @@ -279,7 +279,11 @@ class RegisterForm(Form):
279 279 [validators.Required(err_msg),
280 280 validators.EqualTo('confirm', err_msg_2)])
281 281  
282   - confirm = PasswordField(lazy_gettext('Repeat Password'))
  282 + confirm = PasswordField(lazy_gettext('Repeat Password'))
  283 + profile = SelectField(lazy_gettext('You want to participate as'))
  284 +
  285 + def set_profile_choices(self, choices):
  286 + self.profile.choices = choices
283 287  
284 288  
285 289 class UpdateProfileForm(Form):
... ...
pybossa/model/profile.py 0 → 100644
... ... @@ -0,0 +1,41 @@
  1 +# -*- coding: utf8 -*-
  2 +# This file is part of PyBossa.
  3 +#
  4 +# Copyright (C) 2015 SciFabric LTD.
  5 +#
  6 +# PyBossa is free software: you can redistribute it and/or modify
  7 +# it under the terms of the GNU Affero General Public License as published by
  8 +# the Free Software Foundation, either version 3 of the License, or
  9 +# (at your option) any later version.
  10 +#
  11 +# PyBossa is distributed in the hope that it will be useful,
  12 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 +# GNU Affero General Public License for more details.
  15 +#
  16 +# You should have received a copy of the GNU Affero General Public License
  17 +# along with PyBossa. If not, see <http://www.gnu.org/licenses/>.
  18 +
  19 +from sqlalchemy import Integer, Text
  20 +from sqlalchemy.schema import Column, ForeignKey
  21 +from sqlalchemy.dialects.postgresql import ARRAY
  22 +
  23 +from pybossa.core import db
  24 +from pybossa.model import DomainObject, make_timestamp
  25 +
  26 +
  27 +class Profile(db.Model, DomainObject):
  28 + '''A Table with Profiles for Users.'''
  29 +
  30 + __tablename__ = 'profile'
  31 +
  32 + #: Category ID
  33 + id = Column(Integer, primary_key=True)
  34 + #: Name of the Profile
  35 + name = Column(Text, nullable=False, unique=True)
  36 + #: Description of the Profile
  37 + description = Column(Text, nullable=False)
  38 + #: Set of allowed projects for the profile
  39 + access = Column(ARRAY(Text), nullable=False)
  40 + #: UTC timestamp when the Category was created
  41 + created = Column(Text, default=make_timestamp)
... ...
pybossa/model/user.py
... ... @@ -61,11 +61,13 @@ class User(db.Model, DomainObject, UserMixin):
61 61 confirmation_email_sent = Column(Boolean, default=False)
62 62 subscribed = Column(Boolean, default=True)
63 63 info = Column(MutableDict.as_mutable(JSON), default=dict())
64   -
  64 + profile_id = Column(Integer, ForeignKey('profile.id'))
  65 +
65 66 ## Relationships
66 67 task_runs = relationship(TaskRun, backref='user')
67 68 projects = relationship(Project, backref='owner')
68 69 blogposts = relationship(Blogpost, backref='owner')
  70 + profile = relationship("Profile")
69 71  
70 72  
71 73 def get_id(self):
... ...
pybossa/repositories/user_repository.py
... ... @@ -20,6 +20,7 @@ from sqlalchemy import or_, func
20 20 from sqlalchemy.exc import IntegrityError
21 21  
22 22 from pybossa.model.user import User
  23 +from pybossa.model.profile import Profile
23 24 from pybossa.exc import WrongObjectError, DBIntegrityError
24 25  
25 26  
... ... @@ -86,3 +87,17 @@ class UserRepository(object):
86 87 name = user.__class__.__name__
87 88 msg = '%s cannot be %s by %s' % (name, action, self.__class__.__name__)
88 89 raise WrongObjectError(msg)
  90 +
  91 + # Methods for Profile objects
  92 + def get_profile(self, id=None):
  93 + if id is None:
  94 + return self.db.session.query(Profile).first()
  95 + return self.db.session.query(Profile).get(id)
  96 +
  97 + def get_profile_by(self, **attributes):
  98 + return self.db.session.query(Profile).filter_by(**attributes).first()
  99 +
  100 + def profile_has_access(self, user, project_name):
  101 + profile = self.get_profile(user.profile_id)
  102 + return user.admin or project_name in profile.access
  103 +
... ...
pybossa/themes/default/templates/account/register.html
... ... @@ -20,6 +20,7 @@
20 20 {{ render_field(form.email_addr, placeholder= _('hello@mywebsite.org')) }}
21 21 {{ render_field(form.password, placeholder= _('my secret password')) }}
22 22 {{ render_field(form.confirm, placeholder= _('my secret password')) }}
  23 + {{ render_field(form.profile) }}
23 24 <div class="form-actions">
24 25 <input type="submit" value="{{ _('Create an account') }}" class="btn btn-primary btn-lg" />
25 26 <input type="reset" value="{{ _('Cancel') }}" class="btn btn-default" />
... ...
pybossa/themes/default/translations/pt_BR/LC_MESSAGES/messages.mo
No preview for this file type
pybossa/themes/default/translations/pt_BR/LC_MESSAGES/messages.po
... ... @@ -8,7 +8,7 @@ msgstr &quot;&quot;
8 8 "Project-Id-Version: PROJECT VERSION\n"
9 9 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10 10 "POT-Creation-Date: 2015-08-20 13:26-0300\n"
11   -"PO-Revision-Date: 2016-05-19 13:51-0300\n"
  11 +"PO-Revision-Date: 2016-05-24 18:51-0300\n"
12 12 "Language-Team: pt_BR <LL@li.org>\n"
13 13 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
14 14 "MIME-Version: 1.0\n"
... ... @@ -21,8 +21,7 @@ msgstr &quot;&quot;
21 21  
22 22 #: core.py:413
23 23 msgid "Please update your e-mail address in your profile page, right now it is empty!"
24   -msgstr ""
25   -"Por favor atualize seu endereço de e-mail em seu perfil, faça-o agora pois ele está vazio!"
  24 +msgstr "Por favor atualize seu endereço de e-mail em seu perfil, faça-o agora pois ele está vazio!"
26 25  
27 26 #: importers.py:93
28 27 msgid "The file you uploaded has two headers with the same name."
... ... @@ -72,22 +71,19 @@ msgstr &quot;Usuários Autenticados&quot;
72 71  
73 72 #: exporter/csv_export.py:91
74 73 msgid ""
75   -"Oops, the project does not have tasks to export, if you are the "
76   -"owner add some tasks"
  74 +"Oops, the project does not have tasks to export, if you are the owner add "
  75 +"some tasks"
77 76 msgstr ""
78   -"Oops, o projeto não tem tarefas para exportar, se você é o "
79   -"priprietário adicione algumas tarefas"
  77 +"Oops, o projeto não tem tarefas para exportar, se você é o priprietário "
  78 +"adicione algumas tarefas"
80 79  
81 80 #: exporter/csv_export.py:97
82 81 msgid ""
83   -"Oops, there are no Task Runs yet to export, invite some users to "
84   -"participate"
  82 +"Oops, there are no Task Runs yet to export, invite some users to participate"
85 83 msgstr ""
86   -"Oops, não existem execuções para exportar, convide usuários para "
87   -"participar"
  84 +"Oops, não existem execuções para exportar, convide usuários para participar"
88 85  
89   -#: forms/forms.py:40 forms/forms.py:346
90   -#: themes/pybossa-contribua-theme/templates/stats/index.html:18
  86 +#: forms/forms.py:40 forms/forms.py:346 themes/pybossa-contribua-theme/templates/stats/index.html:18
91 87 msgid "Name"
92 88 msgstr "Nome"
93 89  
... ... @@ -145,41 +141,35 @@ msgstr &quot;Senha (deixe em branco para nenhuma alteração)&quot;
145 141 msgid "Webhook"
146 142 msgstr ""
147 143  
148   -#: forms/forms.py:80
149   -#: themes/pybossa-contribua-theme/templates/projects/task_settings.html:41
  144 +#: forms/forms.py:80 themes/pybossa-contribua-theme/templates/projects/task_settings.html:41
150 145 #: view/projects.py:1206
151 146 msgid "Redundancy"
152 147 msgstr "Redundância"
153 148  
154 149 #: forms/forms.py:84
155 150 msgid ""
156   -"Number of answers should be a "
157   -"value between 1 and 1,000"
  151 +"Number of answers should be a value between 1 "
  152 +"and 1,000"
158 153 msgstr ""
159   -"Número de respostas deve ser um "
160   -"valor entre 1 e 1,000"
  154 +"Número de respostas deve ser um valor entre 1 "
  155 +"e 1,000"
161 156  
162 157 #: forms/forms.py:89
163 158 msgid "Task IDs"
164 159 msgstr "IDs das tarefas"
165 160  
166   -#: forms/forms.py:93
167   -#: themes/pybossa-contribua-theme/templates/projects/task_settings.html:25
  161 +#: forms/forms.py:93 themes/pybossa-contribua-theme/templates/projects/task_settings.html:25
168 162 msgid "Priority"
169 163 msgstr "Prioridade"
170 164  
171 165 #: forms/forms.py:96
172 166 msgid ""
173   -"Priority should be a value between "
174   -"0.0 and 1.0"
  167 +"Priority should be a value between 0.0 and 1.0"
175 168 msgstr ""
176   -"Prioridade deve ser um valor entre "
177   -"0.0 e 1.0"
  169 +"Prioridade deve ser um valor entre 0.0 e 1.0"
178 170  
179   -#: forms/forms.py:103
180   -#: themes/pybossa-contribua-theme/templates/projects/task_scheduler.html:11
181   -#: themes/pybossa-contribua-theme/templates/projects/task_settings.html:16
182   -#: view/projects.py:1238
  171 +#: forms/forms.py:103 themes/pybossa-contribua-theme/templates/projects/task_scheduler.html:11
  172 +#: themes/pybossa-contribua-theme/templates/projects/task_settings.html:16 view/projects.py:1238
183 173 msgid "Task Scheduler"
184 174 msgstr "Escalonador de tarefas"
185 175  
... ... @@ -503,19 +493,18 @@ msgstr &quot;Só mais um passo, por favor&quot;
503 493  
504 494 #: themes/pybossa-contribua-theme/templates/account/account_validation.html:7
505 495 msgid ""
506   -"In order to confirm your identity, we've sent an email to the address you just provided. "
507   -"Please, check it out and click on the link you'll find to create your account at"
  496 +"In order to confirm your identity, we've sent an email to the address you just provided. Please, "
  497 +"check it out and click on the link you'll find to create your account at"
508 498 msgstr ""
509   -"A fim de confirmar sua identidade, nós enviamos um email para o endereço que você "
510   -"forneceu. Por favor, verifique e clique no link que você encontrar para criar sua conta em"
  499 +"A fim de confirmar sua identidade, nós enviamos um email para o endereço que você forneceu. Por "
  500 +"favor, verifique e clique no link que você encontrar para criar sua conta em"
511 501  
512 502 #: themes/pybossa-contribua-theme/templates/account/account_validation.html:8
513 503 msgid ""
514   -"If you are not receiving the email, please check the junk folder. If it's not there "
515   -"please drop us an email to"
  504 +"If you are not receiving the email, please check the junk folder. If it's not there please drop us an "
  505 +"email to"
516 506 msgstr ""
517   -"Se você não receber o email, por favor verifique sua lixeira. E se não encontrar, mande "
518   -"um email para"
  507 +"Se você não receber o email, por favor verifique sua lixeira. E se não encontrar, mande um email para"
519 508  
520 509 #: themes/pybossa-contribua-theme/templates/account/account_validation.html:9
521 510 msgid "In the meantime, you can check some of the amazing"
... ... @@ -868,19 +857,15 @@ msgid &quot;Danger Zone!&quot;
868 857 msgstr "Zona Perigosa!"
869 858  
870 859 #: themes/pybossa-contribua-theme/templates/admin/del_category.html:12
871   -msgid ""
872   -"Deleting the category will remove it from all the projects! This operation cannot be "
873   -"undone!"
  860 +msgid "Deleting the category will remove it from all the projects! This operation cannot be undone!"
874 861 msgstr ""
875   -"Removendo a categoria irá removê-la de todas as aplicações! Esta operação não pode ser "
876   -"desfeita!"
  862 +"Removendo a categoria irá removê-la de todas as aplicações! Esta operação não pode ser desfeita!"
877 863  
878 864 #: themes/pybossa-contribua-theme/templates/admin/del_category.html:18
879 865 msgid "No, do not delete it"
880 866 msgstr "Não, não apague isto"
881 867  
882   -#: themes/pybossa-contribua-theme/templates/admin/index.html:14 view/admin.py:388
883   -#: view/admin.py:401
  868 +#: themes/pybossa-contribua-theme/templates/admin/index.html:14 view/admin.py:388 view/admin.py:401
884 869 msgid "Dashboard"
885 870 msgstr ""
886 871  
... ... @@ -958,8 +943,7 @@ msgstr &quot;Gerenciar projetos em destaque&quot;
958 943 msgid "Update Category"
959 944 msgstr "Atualizar Categoria"
960 945  
961   -#: themes/pybossa-contribua-theme/templates/admin/users.html:11 view/admin.py:135
962   -#: view/admin.py:139
  946 +#: themes/pybossa-contribua-theme/templates/admin/users.html:11 view/admin.py:135 view/admin.py:139
963 947 msgid "Manage Admin Users"
964 948 msgstr "Gerenciar usuários administradores"
965 949  
... ... @@ -981,19 +965,17 @@ msgstr &quot;Usuários atuais com privilégio de administrador&quot;
981 965  
982 966 #: themes/pybossa-contribua-theme/templates/home/_about.html:5
983 967 msgid ""
984   -"PyBossa is a free, open-source crowd-sourcing and micro-tasking platform. It enables "
985   -"people to create and run projects that utilise online assistance in performing tasks that "
986   -"require human cognition such as image classification, transcription, geocoding and more. "
987   -"PyBossa is there to help researchers, civic hackers and developers to create projects "
988   -"where anyone around the world with some time, interest and an internet connection can "
989   -"contribute."
990   -msgstr ""
991   -"PyBossa é uma plataforma open-source, crowd-sourcing e micro-tasking. Ele permite que as "
992   -"pessoas criem e executem projetos que utilizam assistência online na execução de tarefas "
993   -"que requerem cognição humana, tais como classificação de imagens, transcrição, "
994   -"geocodificação e muito mais. PyBossa foi criado para ajudar pesquisadores, hackers "
995   -"cívicos e desenvolvedores a criar projetos onde qualquer pessoa no mundo com algum tempo, "
996   -"interesse e uma conexão à internet pode contribuir."
  968 +"PyBossa is a free, open-source crowd-sourcing and micro-tasking platform. It enables people to create "
  969 +"and run projects that utilise online assistance in performing tasks that require human cognition such "
  970 +"as image classification, transcription, geocoding and more. PyBossa is there to help researchers, "
  971 +"civic hackers and developers to create projects where anyone around the world with some time, "
  972 +"interest and an internet connection can contribute."
  973 +msgstr ""
  974 +"PyBossa é uma plataforma open-source, crowd-sourcing e micro-tasking. Ele permite que as pessoas "
  975 +"criem e executem projetos que utilizam assistência online na execução de tarefas que requerem "
  976 +"cognição humana, tais como classificação de imagens, transcrição, geocodificação e muito mais. "
  977 +"PyBossa foi criado para ajudar pesquisadores, hackers cívicos e desenvolvedores a criar projetos onde "
  978 +"qualquer pessoa no mundo com algum tempo, interesse e uma conexão à internet pode contribuir."
997 979  
998 980 #: themes/pybossa-contribua-theme/templates/home/_about.html:8
999 981 msgid "PyBossa is different to existing efforts:"
... ... @@ -1006,31 +988,31 @@ msgstr &quot;É 100%% open-source&quot;
1006 988  
1007 989 #: themes/pybossa-contribua-theme/templates/home/_about.html:11
1008 990 msgid ""
1009   -"Unlike, say, “mechanical turk” style projects, PyBossa is not designed to handle payment "
1010   -"or money — it is designed to support volunteer-driven projects."
  991 +"Unlike, say, “mechanical turk” style projects, PyBossa is not designed to handle payment or money — "
  992 +"it is designed to support volunteer-driven projects."
1011 993 msgstr ""
1012   -"Ao contrário de, digamos, projetos estilo “mechanical turk”, PyBossa não é projetado para "
1013   -"com pagamento ou dinheiro — se destina a apoiar projetos conduzidos por voluntários."
  994 +"Ao contrário de, digamos, projetos estilo “mechanical turk”, PyBossa não é projetado para com "
  995 +"pagamento ou dinheiro — se destina a apoiar projetos conduzidos por voluntários."
1014 996  
1015 997 #: themes/pybossa-contribua-theme/templates/home/_about.html:13
1016 998 msgid ""
1017   -"It's designed as a platform and framework for developing deploying crowd-sourcing and "
1018   -"microtasking project rather than being a crowd-sourcing project itself. Individual crowd-"
1019   -"sourcing projects are written as simple snippets of Javascript and HTML which are then "
1020   -"deployed on a PyBossa instance (such as"
  999 +"It's designed as a platform and framework for developing deploying crowd-sourcing and microtasking "
  1000 +"project rather than being a crowd-sourcing project itself. Individual crowd-sourcing projects are "
  1001 +"written as simple snippets of Javascript and HTML which are then deployed on a PyBossa instance (such "
  1002 +"as"
1021 1003 msgstr ""
1022   -"Ele foi projetado como uma estrutura e plataforma para desenvolver a implantação de "
1023   -"projetos de crowd-sourcing e microtasking ao invés de ser em sí um projeto de crowd-"
1024   -"sourcing.Projetos crowd-sourcing individuais são escritos como trechos simples em "
1025   -"Javascript e HTML que são implantados em uma instância PyBossa(como o"
  1004 +"Ele foi projetado como uma estrutura e plataforma para desenvolver a implantação de projetos de crowd-"
  1005 +"sourcing e microtasking ao invés de ser em sí um projeto de crowd-sourcing.Projetos crowd-sourcing "
  1006 +"individuais são escritos como trechos simples em Javascript e HTML que são implantados em uma "
  1007 +"instância PyBossa(como o"
1026 1008  
1027 1009 #: themes/pybossa-contribua-theme/templates/home/_about.html:13
1028 1010 msgid ""
1029   -"This way one can easily develop custom projects while using the PyBossa platform to store "
1030   -"your data, manage users, and handle workflow"
  1011 +"This way one can easily develop custom projects while using the PyBossa platform to store your data, "
  1012 +"manage users, and handle workflow"
1031 1013 msgstr ""
1032   -"Desta forma, pode-se facilmente desenvolver projetos personalizados ao usar a plataforma "
1033   -"PyBossa para armazenar seus dados, gerenciar usuários e lidar com o fluxo de trabalho"
  1014 +"Desta forma, pode-se facilmente desenvolver projetos personalizados ao usar a plataforma PyBossa para "
  1015 +"armazenar seus dados, gerenciar usuários e lidar com o fluxo de trabalho"
1034 1016  
1035 1017 #: themes/pybossa-contribua-theme/templates/home/_about.html:18
1036 1018 msgid "You can read more about the architecture in the"
... ... @@ -1054,10 +1036,8 @@ msgid &quot;Statistics&quot;
1054 1036 msgstr "Estatísticas"
1055 1037  
1056 1038 #: themes/pybossa-contribua-theme/templates/home/_about.html:23
1057   -msgid ""
1058   -" PyBossa provides individual statistics for every project in the system, as well as a"
1059   -msgstr ""
1060   -" PyBossa fornece estatísticas individuais para qualquer projeto do sistema, bem como uma"
  1039 +msgid " PyBossa provides individual statistics for every project in the system, as well as a"
  1040 +msgstr " PyBossa fornece estatísticas individuais para qualquer projeto do sistema, bem como uma"
1061 1041  
1062 1042 #: themes/pybossa-contribua-theme/templates/home/_about.html:23
1063 1043 msgid "general overview about the system like total number of users, tasks, etc"
... ... @@ -1329,10 +1309,8 @@ msgid &quot;If you delete the project and its tasks, it will be gone forever!&quot;
1329 1309 msgstr "Se você excluir o projeto e suas tarefas, ele não poderar ser recuperado!"
1330 1310  
1331 1311 #: themes/pybossa-contribua-theme/templates/projects/delete.html:18
1332   -msgid ""
1333   -"Are you sure you want to delete this project and all its tasks and associated task runs?"
1334   -msgstr ""
1335   -"Você está certo que deseja excluir o projeto, suas tarefas e as execuções das tarefas?"
  1312 +msgid "Are you sure you want to delete this project and all its tasks and associated task runs?"
  1313 +msgstr "Você está certo que deseja excluir o projeto, suas tarefas e as execuções das tarefas?"
1336 1314  
1337 1315 #: themes/pybossa-contribua-theme/templates/projects/delete.html:21
1338 1316 msgid "No, do not delete it!"
... ... @@ -1384,11 +1362,11 @@ msgstr &quot;IMPORTANTE&quot;
1384 1362  
1385 1363 #: themes/pybossa-contribua-theme/templates/projects/export.html:55
1386 1364 msgid ""
1387   -"This export option stills in beta mode and may fail in the CKAN server. If you get an "
1388   -"error, please send an e-mail to info@pybossa.com"
  1365 +"This export option stills in beta mode and may fail in the CKAN server. If you get an error, please "
  1366 +"send an e-mail to info@pybossa.com"
1389 1367 msgstr ""
1390   -"Esta opção de exportação está em modo beta e pode não funcionar no servidor CKAN. Se você "
1391   -"receber um erro, por favor mande um e-mail para info@pybossa.com"
  1368 +"Esta opção de exportação está em modo beta e pode não funcionar no servidor CKAN. Se você receber um "
  1369 +"erro, por favor mande um e-mail para info@pybossa.com"
1392 1370  
1393 1371 #: themes/pybossa-contribua-theme/templates/projects/export.html:60
1394 1372 msgid "You don't have a Datahub.io API key in your"
... ... @@ -1453,11 +1431,10 @@ msgid &quot;&quot;
1453 1431 "it \n"
1454 1432 " · How? Explain how your project "
1455 1433 "works \n"
1456   -" · How you can help: Explain to the volunteers how they can help and "
1457   -"contribute to the goal of your "
1458   -"project \n"
1459   -" · Will you help make a difference? Explain to the volunteers why their "
1460   -"contribution is essential and how the result of your project can help change "
  1434 +" · How you can help: Explain to the volunteers how they can help and contribute to the "
  1435 +"goal of your project \n"
  1436 +" · Will you help make a difference? Explain to the volunteers why their contribution "
  1437 +"is essential and how the result of your project can help change "
1461 1438 "things! \n"
1462 1439 " (you can use Markdown to give format to your description!)"
1463 1440 msgstr ""
... ... @@ -1466,10 +1443,10 @@ msgstr &quot;&quot;
1466 1443 "alcançar \n"
1467 1444 " · Como? Explique como seu projeto "
1468 1445 "funciona \n"
1469   -" · como ajudar: Explique aos voluntátios como eles podem contribuir para o "
1470   -"objetivo do seu projeto \n"
1471   -" · você ajudará a fazer a diferença? Explique aos voluntários porque sua "
1472   -"contribuição é essencial e como o resultado do seu projeto pode mudar as "
  1446 +" · como ajudar: Explique aos voluntátios como eles podem contribuir para o objetivo do "
  1447 +"seu projeto \n"
  1448 +" · você ajudará a fazer a diferença? Explique aos voluntários porque sua contribuição "
  1449 +"é essencial e como o resultado do seu projeto pode mudar as "
1473 1450 "coisas! \n"
1474 1451 " (você pode utilizar Markdown para formatar sua descrição!)"
1475 1452  
... ... @@ -1505,11 +1482,11 @@ msgstr &quot;Enviar&quot;
1505 1482  
1506 1483 #: themes/pybossa-contribua-theme/templates/projects/presenter.html:22
1507 1484 msgid ""
1508   -"Sorry, you've contributed to all the tasks for this project, but this project still needs "
1509   -"more volunteers, so please spread the word!"
  1485 +"Sorry, you've contributed to all the tasks for this project, but this project still needs more "
  1486 +"volunteers, so please spread the word!"
1510 1487 msgstr ""
1511   -"Desculpe, você contribuiu para todas as tarefas deste projeto, mas este projeto ainda "
1512   -"precisa de mais voluntários, então convide outros colaboradores!"
  1488 +"Desculpe, você contribuiu para todas as tarefas deste projeto, mas este projeto ainda precisa de mais "
  1489 +"voluntários, então convide outros colaboradores!"
1513 1490  
1514 1491 #: themes/pybossa-contribua-theme/templates/projects/settings.html:14
1515 1492 msgid "Project Settings"
... ... @@ -1696,8 +1673,7 @@ msgid &quot;Close&quot;
1696 1673 msgstr "Fechar"
1697 1674  
1698 1675 #: themes/pybossa-contribua-theme/templates/projects/task_priority.html:13
1699   -#: themes/pybossa-contribua-theme/templates/projects/task_settings.html:23
1700   -#: view/projects.py:1285
  1676 +#: themes/pybossa-contribua-theme/templates/projects/task_settings.html:23 view/projects.py:1285
1701 1677 msgid "Task Priority"
1702 1678 msgstr "Prioridade da tarefa"
1703 1679  
... ... @@ -1710,13 +1686,10 @@ msgid &quot;priority&quot;
1710 1686 msgstr "prioridade"
1711 1687  
1712 1688 #: themes/pybossa-contribua-theme/templates/projects/task_priority.html:14
1713   -msgid ""
1714   -"of one or more tasks, providing a list of task IDs separated by commas. The lowest "
1715   -"priority is"
  1689 +msgid "of one or more tasks, providing a list of task IDs separated by commas. The lowest priority is"
1716 1690 msgstr ""
1717 1691 "de uma ou mais tarefas,\n"
1718   -" fornecendo uma lista de IDs das tarefas separadas por vírgula. A "
1719   -"prioridade\n"
  1692 +" fornecendo uma lista de IDs das tarefas separadas por vírgula. A prioridade\n"
1720 1693 " mais baixa é"
1721 1694  
1722 1695 #: themes/pybossa-contribua-theme/templates/projects/task_priority.html:14
... ... @@ -1915,11 +1888,11 @@ msgstr &quot;O primeiro número representa o total de respostas submetidas para a tar
1915 1888  
1916 1889 #: themes/pybossa-contribua-theme/templates/projects/tasks_browse.html:18
1917 1890 msgid ""
1918   -"This redundancy method will help to detect errors, typos, data forging, etc. when the "
1919   -"task has been completed"
  1891 +"This redundancy method will help to detect errors, typos, data forging, etc. when the task has been "
  1892 +"completed"
1920 1893 msgstr ""
1921   -"Este método de redundância vai ajudar a detectar erros, erros de digitação, forjamento de "
1922   -"dados, etc., quando a tarefa for concluída"
  1894 +"Este método de redundância vai ajudar a detectar erros, erros de digitação, forjamento de dados, "
  1895 +"etc., quando a tarefa for concluída"
1923 1896  
1924 1897 #: themes/pybossa-contribua-theme/templates/projects/tasks_browse.html:18
1925 1898 msgid "second number"
... ... @@ -1987,11 +1960,10 @@ msgstr &quot;De um arquivo CSV&quot;
1987 1960  
1988 1961 #: themes/pybossa-contribua-theme/templates/projects/importers/csv.html:19
1989 1962 msgid ""
1990   -"Please provide a URL (i.e. DropBox, Box, Ubuntu One, etc. public link) to a CSV file with "
1991   -"data for"
  1963 +"Please provide a URL (i.e. DropBox, Box, Ubuntu One, etc. public link) to a CSV file with data for"
1992 1964 msgstr ""
1993   -"Por favor forneça uma URL (i.e. DropBox, Box, Ubuntu One, etc. link público) para o "
1994   -"arquivo CSV com dados para"
  1965 +"Por favor forneça uma URL (i.e. DropBox, Box, Ubuntu One, etc. link público) para o arquivo CSV com "
  1966 +"dados para"
1995 1967  
1996 1968 #: themes/pybossa-contribua-theme/templates/projects/importers/csv.html:19
1997 1969 #: themes/pybossa-contribua-theme/templates/projects/importers/dropbox.html:25
... ... @@ -2031,8 +2003,7 @@ msgstr &quot;De um projeto EpiCollect Plus&quot;
2031 2003  
2032 2004 #: themes/pybossa-contribua-theme/templates/projects/importers/epicollect.html:19
2033 2005 msgid "Please provide an EpiCollect Plus project name to import its data for"
2034   -msgstr ""
2035   -"Por favor forneça o nome de um projeto EpiCollect Plus de modo a importar seus dados para"
  2006 +msgstr "Por favor forneça o nome de um projeto EpiCollect Plus de modo a importar seus dados para"
2036 2007  
2037 2008 #: themes/pybossa-contribua-theme/templates/projects/importers/epicollect.html:21
2038 2009 msgid "The name of the public EpiCollect Plus project"
... ... @@ -2449,13 +2420,12 @@ msgstr &quot;Oooops, email/senha incorreto&quot;
2449 2420  
2450 2421 #: view/account.py:112
2451 2422 msgid "Ooops, we didn't find you in the system, did you sign up?"
2452   -msgstr ""
2453   -"Ooops, não encontramos você no sistema, você se cadastrou?"
  2423 +msgstr "Ooops, não encontramos você no sistema, você se cadastrou?"
2454 2424  
2455   -#: view/account.py:117 view/account.py:216 view/account.py:491 view/account.py:507
2456   -#: view/account.py:521 view/account.py:554 view/admin.py:268 view/admin.py:349
2457   -#: view/projects.py:219 view/projects.py:276 view/projects.py:415 view/projects.py:1225
2458   -#: view/projects.py:1276 view/projects.py:1321 view/projects.py:1396 view/projects.py:1441
  2425 +#: view/account.py:117 view/account.py:216 view/account.py:491 view/account.py:507 view/account.py:521
  2426 +#: view/account.py:554 view/admin.py:268 view/admin.py:349 view/projects.py:219 view/projects.py:276
  2427 +#: view/projects.py:415 view/projects.py:1225 view/projects.py:1276 view/projects.py:1321
  2428 +#: view/projects.py:1396 view/projects.py:1441
2459 2429 msgid "Please correct the errors"
2460 2430 msgstr "Por favor corrija os erros"
2461 2431  
... ... @@ -2488,20 +2458,18 @@ msgid &quot;Profile&quot;
2488 2458 msgstr "Perfil"
2489 2459  
2490 2460 #: view/account.py:448
2491   -msgid ""
2492   -"Your avatar has been updated! It may take some minutes to refresh..."
  2461 +msgid "Your avatar has been updated! It may take some minutes to refresh..."
2493 2462 msgstr ""
2494   -"Seu avatar está sendo atualizado! pode demorar alguns minutos para "
2495   -"atualização..."
  2463 +"Seu avatar está sendo atualizado! pode demorar alguns minutos para atualização..."
2496 2464  
2497 2465 #: view/account.py:478
2498 2466 #, python-format
2499 2467 msgid ""
2500   -"An email has been sent to verify your new email: %s. Once you "
2501   -"verify it, it will be updated.email_addr"
  2468 +"An email has been sent to verify your new email: %s. Once you verify it, it "
  2469 +"will be updated.email_addr"
2502 2470 msgstr ""
2503   -"Um email foi enviado para veirificar seu novo email: %s. Uma vez "
2504   -"que você verificar, será atualizado.email_addr"
  2471 +"Um email foi enviado para veirificar seu novo email: %s. Uma vez que você "
  2472 +"verificar, será atualizado.email_addr"
2505 2473  
2506 2474 #: view/account.py:489 view/account.py:519
2507 2475 msgid "Your profile has been updated!"
... ... @@ -2525,11 +2493,11 @@ msgstr &quot;Nós lhe enviamos um email com as instruções para recuperação de sua
2525 2493  
2526 2494 #: view/account.py:609
2527 2495 msgid ""
2528   -"We don't have this email in our records. You may have signed up with a different email or "
2529   -"used Twitter, Facebook, or Google to sign-in"
  2496 +"We don't have this email in our records. You may have signed up with a different email or used "
  2497 +"Twitter, Facebook, or Google to sign-in"
2530 2498 msgstr ""
2531   -"Nós não temos este email em nossos registros. Você deve ter entrado com um email "
2532   -"diferente ou usado sua conta do Twitter, Facebook ou Google"
  2499 +"Nós não temos este email em nossos registros. Você deve ter entrado com um email diferente ou usado "
  2500 +"sua conta do Twitter, Facebook ou Google"
2533 2501  
2534 2502 #: view/account.py:614
2535 2503 msgid "Something went wrong, please correct the errors on the form"
... ... @@ -2549,11 +2517,10 @@ msgstr &quot;Categoria removida&quot;
2549 2517  
2550 2518 #: view/admin.py:306
2551 2519 msgid ""
2552   -"Sorry, it is not possible to delete the only available category. You can modify it, "
2553   -"click the edit button"
  2520 +"Sorry, it is not possible to delete the only available category. You can modify it, click the edit "
  2521 +"button"
2554 2522 msgstr ""
2555   -"Desculpe, não é possível remover a única categoria disponível. Você pode modificá-la no "
2556   -"botão Editar"
  2523 +"Desculpe, não é possível remover a única categoria disponível. Você pode modificá-la no botão Editar"
2557 2524  
2558 2525 #: view/admin.py:345
2559 2526 msgid "Category updated"
... ... @@ -2593,11 +2560,9 @@ msgstr &quot;import de CSV&quot;
2593 2560  
2594 2561 #: view/projects.py:286
2595 2562 msgid ""
2596   -" or download the project bundle and run the <strong>createTasks.py</strong> script in "
2597   -"your computer"
  2563 +" or download the project bundle and run the <strong>createTasks.py</strong> script in your computer"
2598 2564 msgstr ""
2599   -" ou faça o download do pacote e execute o script <strong>createTasks.py</strong> em seu "
2600   -"computador"
  2565 +" ou faça o download do pacote e execute o script <strong>createTasks.py</strong> em seu computador"
2601 2566  
2602 2567 #: view/projects.py:352
2603 2568 msgid "Project deleted!"
... ... @@ -2609,11 +2574,11 @@ msgstr &quot;Projeto atualizado!&quot;
2609 2574  
2610 2575 #: view/projects.py:434
2611 2576 msgid ""
2612   -"Your project thumbnail has been updated! It may take "
2613   -"some minutes to refresh..."
  2577 +"Your project thumbnail has been updated! It may take some minutes "
  2578 +"to refresh..."
2614 2579 msgstr ""
2615   -"A miniatura do seu projeto foi atualizada! Pode demorar "
2616   -"alguns minutos para atualização..."
  2580 +"A miniatura do seu projeto foi atualizada! Pode demorar alguns "
  2581 +"minutos para atualização..."
2617 2582  
2618 2583 #: view/projects.py:437
2619 2584 msgid "You must provide a file to change the avatar"
... ... @@ -2625,11 +2590,11 @@ msgstr &quot;Importando tarefas, isto pode demorar um pouco, aguarde...&quot;
2625 2590  
2626 2591 #: view/projects.py:573
2627 2592 msgid ""
2628   -"You're trying to import a large amount of tasks, so please be patient. You "
2629   -"will receive an email when the tasks are ready."
  2593 +"You're trying to import a large amount of tasks, so please be patient. You will receive an "
  2594 +"email when the tasks are ready."
2630 2595 msgstr ""
2631   -"Você está tentando importar uma grande quantidade de tarefas, por favor seja "
2632   -"paciente. Você receberá um e-mail quando as tarefas estiverem prontas."
  2596 +"Você está tentando importar uma grande quantidade de tarefas, por favor seja paciente. "
  2597 +"Você receberá um e-mail quando as tarefas estiverem prontas."
2633 2598  
2634 2599 #: view/projects.py:616
2635 2600 msgid "Success! Tasks will be imported daily."
... ... @@ -2641,13 +2606,11 @@ msgstr &quot;Desculpe, senha incorreta&quot;
2641 2606  
2642 2607 #: view/projects.py:700
2643 2608 msgid "Ooops! You are an anonymous user and will not get any credit for your contributions."
2644   -msgstr ""
2645   -"Ooops! Você é um usuário anônimo e não ganhará nenhum crédito por suas contribuições."
  2609 +msgstr "Ooops! Você é um usuário anônimo e não ganhará nenhum crédito por suas contribuições."
2646 2610  
2647 2611 #: view/projects.py:719 view/projects.py:771
2648 2612 msgid "Sorry, but this project is still a draft and does not have a task presenter."
2649   -msgstr ""
2650   -"Desculpe, mas este projeto ainda é um rascunho e não tem nenhum visualizadorde tarefas."
  2613 +msgstr "Desculpe, mas este projeto ainda é um rascunho e não tem nenhum visualizadorde tarefas."
2651 2614  
2652 2615 #: view/projects.py:899
2653 2616 msgid "All the tasks and associated task runs have been deleted"
... ... @@ -2663,19 +2626,16 @@ msgstr &quot;Dados exportados para &quot;
2663 2626  
2664 2627 #: view/projects.py:1063
2665 2628 msgid ""
2666   -"Oops, the project does not have tasks to export, if you are the owner "
2667   -"add some tasks"
  2629 +"Oops, the project does not have tasks to export, if you are the owner add some "
  2630 +"tasks"
2668 2631 msgstr ""
2669   -"Oops, o projeto não tem tarefas para exportar, se você é o "
2670   -"proprietário adicione algumas tarefas"
  2632 +"Oops, o projeto não tem tarefas para exportar, se você é o proprietário "
  2633 +"adicione algumas tarefas"
2671 2634  
2672 2635 #: view/projects.py:1069
2673 2636 msgid ""
2674   -"Oops, there are no Task Runs yet to export, invite some users to "
2675   -"participate"
2676   -msgstr ""
2677   -"Oops, não existem execuções para exportar,convide usuários para "
2678   -"participar"
  2637 +"Oops, there are no Task Runs yet to export, invite some users to participate"
  2638 +msgstr "Oops, não existem execuções para exportar,convide usuários para participar"
2679 2639  
2680 2640 #: view/projects.py:1221
2681 2641 msgid "Redundancy of Tasks updated!"
... ... @@ -2801,8 +2761,7 @@ msgid &quot;Our records show that you use your&quot;
2801 2761 msgstr ""
2802 2762  
2803 2763 msgid ""
2804   -"account to sign in. Please use the same account to sign-in again. If you forgot the "
2805   -"password to your"
  2764 +"account to sign in. Please use the same account to sign-in again. If you forgot the password to your"
2806 2765 msgstr ""
2807 2766  
2808 2767 msgid "account, please contact"
... ... @@ -2827,8 +2786,8 @@ msgid &quot;Click here to confirm your e-mail address and create your account&quot;
2827 2786 msgstr ""
2828 2787  
2829 2788 msgid ""
2830   -"Online assistance in performing tasks that require human cognition, knowledge or "
2831   -"intelligence such as image classification, transcription, geocoding and more!"
  2789 +"Online assistance in performing tasks that require human cognition, knowledge or intelligence such as "
  2790 +"image classification, transcription, geocoding and more!"
2832 2791 msgstr ""
2833 2792 "Assistência online para execução de tarefas que requerem cognição humana, conhecimento ou "
2834 2793 "inteligência, como classificação de imagens, transcrição, geocodificação e muito mais!"
... ... @@ -2884,8 +2843,7 @@ msgid &quot;&quot;
2884 2843 " priority is"
2885 2844 msgstr ""
2886 2845 "de uma ou mais tarefas,\n"
2887   -" fornecendo uma lista de IDs das tarefas separadas por vírgula. A "
2888   -"prioridade\n"
  2846 +" fornecendo uma lista de IDs das tarefas separadas por vírgula. A prioridade\n"
2889 2847 " mais baixa é"
2890 2848  
2891 2849 msgid ""
... ... @@ -2920,11 +2878,11 @@ msgid &quot;&quot;
2920 2878 "returns a task\n"
2921 2879 " randomly --a user could get the same task twice or more\n"
2922 2880 " times"
2923   -
2924 2881 msgstr ""
2925 2882 "Retorna uma tarefa\n"
2926 2883 " aleatória - um usuário pode receber a tarefa duas ou mais\n"
2927 2884 " vezes"
  2885 +
2928 2886 msgid ""
2929 2887 "If you delete all the\n"
2930 2888 " tasks and task runs they will be gone\n"
... ... @@ -2942,16 +2900,19 @@ msgstr &quot;&quot;
2942 2900 " nada"
2943 2901  
2944 2902 # view/projects.py:807
2945   -msgid "Oops! You have to sign in to participate in <strong>WikiLibras</strong>"
2946   -" project"
  2903 +msgid ""
  2904 +"Oops! You have to sign in to participate in <strong>WikiLibras</strong> "
  2905 +"project"
2947 2906 msgstr "Oops! Você precisa se cadastrar para participar do projeto <strong>WikiLibras</strong>"
2948 2907  
2949   -msgid "Oops! You have to sign in to participate in <strong>Corretor de Sinais</strong>"
2950   -" project"
  2908 +msgid ""
  2909 +"Oops! You have to sign in to participate in <strong>Corretor de Sinais</strong> "
  2910 +"project"
2951 2911 msgstr "Oops! Você precisa se cadastrar para participar do projeto <strong>Corretor de Sinais</strong>"
2952 2912  
2953   -msgid "Oops! You have to sign in to participate in <strong>Validador de Sinais</strong>"
2954   -" project"
  2913 +msgid ""
  2914 +"Oops! You have to sign in to participate in <strong>Validador de Sinais</strong> "
  2915 +"project"
2955 2916 msgstr "Oops! Você precisa se cadastrar para participar do projeto <strong>Validador de Sinais</strong>"
2956 2917  
2957 2918 # themes/default/templates/projects/index.html:30
... ... @@ -2969,3 +2930,30 @@ msgstr &quot;atividade&quot;
2969 2930 # themes/default/templates/projects/index.html:33
2970 2931 msgid "progress"
2971 2932 msgstr "progresso"
  2933 +
  2934 +# forms/forms.py:283
  2935 +msgid "You want to participate as"
  2936 +msgstr "Deseja atuar como"
  2937 +
  2938 +# view/projects.py:758
  2939 +# view/projects.py:815
  2940 +msgid ""
  2941 +"Oops! Your profile <strong>(Colaborador)</strong> does not have access to the <strong>Validador de Sinais</strong> "
  2942 +"project"
  2943 +msgstr "Oops! O seu perfil <strong>(Colaborador)</strong> não tem acesso ao projeto <strong>Validador de Sinais</strong>"
  2944 +
  2945 +msgid ""
  2946 +"Oops! Your profile <strong>(Colaborador)</strong> does not have access to the <strong>Corretor de Sinais</strong> "
  2947 +"project"
  2948 +msgstr "Oops! O seu perfil <strong>(Colaborador)</strong> não tem acesso ao projeto <strong>Corretor de Sinais</strong>"
  2949 +
  2950 +msgid ""
  2951 +"Oops! Your profile <strong>(Animador)</strong> does not have access to the <strong>Validador de Sinais</strong> "
  2952 +"project"
  2953 +msgstr "Oops! O seu perfil <strong>(Animador)</strong> não tem acesso ao projeto <strong>Validador de Sinais</strong>"
  2954 +
  2955 +msgid ""
  2956 +"Oops! Your profile <strong>(Especialista)</strong> does not have access to the <strong>Corretor de Sinais</strong> "
  2957 +"project"
  2958 +msgstr "Oops! O seu perfil <strong>(Especialista)</strong> não tem acesso ao projeto <strong>Corretor de Sinais</strong>"
  2959 +
... ...
pybossa/view/account.py
... ... @@ -199,10 +199,12 @@ def register():
199 199  
200 200 """
201 201 form = RegisterForm(request.form)
  202 + form.set_profile_choices(current_app.config.get('PROFILES'))
202 203 if request.method == 'POST' and form.validate():
203 204 account = dict(fullname=form.fullname.data, name=form.name.data,
204 205 email_addr=form.email_addr.data,
205   - password=form.password.data)
  206 + password=form.password.data, profile=form.profile.data,
  207 + locale=current_app.config.get('DEFAULT_LOCALE'))
206 208 confirm_url = get_email_confirmation_url(account)
207 209 if current_app.config.get('ACCOUNT_CONFIRMATION_DISABLED'):
208 210 return _create_account(account)
... ... @@ -268,10 +270,16 @@ def confirm_account():
268 270  
269 271  
270 272 def _create_account(user_data):
  273 + profile = user_repo.get_profile_by(name=user_data['profile'])
  274 + if profile is None:
  275 + return
  276 +
271 277 new_user = model.user.User(fullname=user_data['fullname'],
272 278 name=user_data['name'],
273 279 email_addr=user_data['email_addr'],
274   - valid_email=True)
  280 + valid_email=True,
  281 + profile_id=profile.id,
  282 + locale=user_data['locale'])
275 283 new_user.set_password(user_data['password'])
276 284 user_repo.save(new_user)
277 285 flash(gettext('Thanks for signing-up'), 'success')
... ...
pybossa/view/projects.py
... ... @@ -738,7 +738,7 @@ def task_presenter(short_name, task_id):
738 738 if not project.allow_anonymous_contributors:
739 739 msg = ("Oops! You have to sign in to participate in "
740 740 "<strong>%s</strong>"
741   - "project" % project.name)
  741 + " project" % project.name)
742 742 flash(gettext(msg), 'warning')
743 743 return redirect(url_for('account.signin',
744 744 next=url_for('.presenter',
... ... @@ -752,6 +752,13 @@ def task_presenter(short_name, task_id):
752 752 short_name=short_name, task_id=task_id)
753 753 url = url_for('account.signin', next=next_url)
754 754 flash(msg_1 + "<a href=\"" + url + "\">Sign in now!</a>", "warning")
  755 +
  756 + if not current_user.is_anonymous() and not user_repo.profile_has_access(current_user, project.short_name):
  757 + profile = user_repo.get_profile(current_user.profile_id)
  758 + msg = "Oops! Your profile <strong>(%s)</strong> does not have access to the <strong>%s</strong> \
  759 + project" % (profile.name, project.name)
  760 + flash(gettext(msg), 'warning')
  761 + return redirect(url_for('project.index'))
755 762  
756 763 title = project_title(project, "Contribute")
757 764 template_args = {"project": project, "title": title, "owner": owner}
... ... @@ -802,6 +809,13 @@ def presenter(short_name):
802 809 title = project_title(project, "Contribute")
803 810 template_args = {"project": project, "title": title, "owner": owner,
804 811 "invite_new_volunteers": invite_new_volunteers(project)}
  812 +
  813 + if not current_user.is_anonymous() and not user_repo.profile_has_access(current_user, project.short_name):
  814 + profile = user_repo.get_profile(current_user.profile_id)
  815 + msg = "Oops! Your profile <strong>(%s)</strong> does not have access to the <strong>%s</strong> \
  816 + project" % (profile.name, project.name)
  817 + flash(gettext(msg), 'warning')
  818 + return redirect(url_for('project.index'))
805 819  
806 820 if not project.allow_anonymous_contributors and current_user.is_anonymous():
807 821 msg = "Oops! You have to sign in to participate in <strong>%s</strong> \
... ...
settings_local.py.tmpl
... ... @@ -60,11 +60,15 @@ CONTACT_TWITTER = &#39;PyBossa&#39;
60 60 ## NOTE: You need to create a symbolic link to the translations folder, otherwise
61 61 ## this wont work.
62 62 ## ln -s pybossa/themes/your-theme/translations pybossa/translations
63   -DEFAULT_LOCALE = 'pt_BR'
  63 +DEFAULT_LOCALE = u'pt_BR'
64 64 LOCALES = [('en', 'English'), ('es', u'Español'),
65 65 ('it', 'Italiano'), ('fr', u'Français'),
66 66 ('ja', u'日本語'),('pt_BR', u'Português (BR)')]
67 67  
  68 +# Profiles
  69 +PROFILES = [('Colaborador','Colaborador'), ('Animador','Animador 3D'), ('Especialista', 'Especialista em LIBRAS')]
  70 +
  71 +
68 72 ## list of administrator emails to which error emails get sent
69 73 # ADMINS = ['me@sysadmin.org']
70 74  
... ...