apyb / associados Goto Github PK
View Code? Open in Web Editor NEWControle de associados a Associação PythonBrasil
Home Page: https://associacao.python.org.br/
Controle de associados a Associação PythonBrasil
Home Page: https://associacao.python.org.br/
Traceback (most recent call last):
File "/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, _callback_args, *_callback_kwargs)
File "/python/lib/python2.7/site-packages/django/views/generic/base.py", line 48, in view
return self.dispatch(request, _args, *_kwargs)
File "/python/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper
return bound_func(_args, *_kwargs)
File "/python/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 77, in wrapped_view
return view_func(_args, *_kwargs)
File "/python/lib/python2.7/site-packages/django/utils/decorators.py", line 21, in bound_func
return func(self, _args2, *_kwargs2)
File "/app/payment/views.py", line 128, in dispatch
return super(NotificationView, self).dispatch(_args, *_kwargs)
File "/python/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in dispatch
return handler(request, _args, *_kwargs)
File "/app/app/payment/views.py", line 133, in post
status, payment_id, price = self.transaction(self.transaction_code)
ValueError: need more than 2 values to unpack
<WSGIRequest path:/payment/notification/, GET:<QueryDict: {}>, POST:<QueryDict: {u'notificationCode': [u'XXXXX-XXXXX-XXXXX-XXXX'], u'notificationType': [u'transaction']}>, COOKIES:{}, META:{'CONTENT_LENGTH': ‘85’,
Recebi a url com localhost ao invés do domino correto.
http://http://localhost:8000/password/reset/15-3ez-1610feafc95adb1e1d59/
Criar uma página inicial do projeto, já usando o twitter-bootstrap,
no primeiro momento, a página terá um link ara o cadastro e outro para a lista de associados da apyb
Os models, e algumas partes dos templates do projeto foram criadas utilizando internacionalização, no entanto, não foi criada nenhuma tradução para português.
docs:
https://docs.djangoproject.com/en/1.4/ref/django-admin/#django-admin-makemessages
https://docs.djangoproject.com/en/1.4/ref/django-admin/#compilemessages
Possibilitar que o usuário atualize as informações enviadas no registro da apyb
Implementar o contrib.auth no projeto para que o usuário posso entrar no site e poder edtar sru dados de associação ou verificar a sua situação de pagamento
Hoje, quando o usuário efetua o registro da associação os dados do usuário são cadastrados, mas ele não possui nenhuma senha de acesso, o modo que ele tem para alterar a sua senha, é ir no "Esqueceu sua senha" na tela de login, dado isso qual seria a melhor abordagem:
qual a melhor abordagem?
gerar um dump dos membros atuais da associação
Melhorar o Header do html para compartilhar informações da APyB.
realizar umn "pente fino" no projeto, buscando mensagens sem suporte a tradução
isso não é possivel pois o membro tem uma ligaçào com o User do django que possui o atributo username unico, como é possivel ter pessoas com o mesmo nome na associação, é necessário alterar a lógica que constrói o usuário aotomaticamente, setando um numero ou un "_" no final do nome
ex.
paulosilva
paulosilva1
paulosilva2
ou
paulosilva
paulosilva_
paulosilva__
O PagSeguro usa latin1/ISO-8859-1 e o sistema, aparentemente, está tratando o POST como utf-8.
Segue o traceback que recebi por email:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/generic/base.py", line 48, in view
return self.dispatch(request, *args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper
return bound_func(*args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 77, in wrapped_view
return view_func(*args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 21, in bound_func
return func(self, *args2, **kwargs2)
File "/app/app/payment/views.py", line 132, in dispatch
return super(NotificationView, self).dispatch(*args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in dispatch
return handler(request, *args, **kwargs)
File "/app/app/payment/views.py", line 138, in post
status, payment_id = self.transaction(notification_code)
File "/app/app/payment/views.py", line 94, in transaction
referencia = int(dom.xpath("//reference")[0].text)
File "lxml.etree.pyx", line 897, in lxml.etree._Element.text.__get__ (src/lxml/lxml.etree.c:37030)
File "apihelpers.pxi", line 691, in lxml.etree._collectText (src/lxml/lxml.etree.c:16634)
File "apihelpers.pxi", line 1344, in lxml.etree.funicode (src/lxml/lxml.etree.c:21872)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe7 in position 23: invalid continuation byte
<WSGIRequest
path:/payment/notification/,
GET:<QueryDict: {}>,
POST:<QueryDict: {u'notificationCode': [u'AEBC4F-16CBF6CBF6BF-0994CF8FA95B-835B79'], u'notificationType': [u'transaction']}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '85',
'CONTENT_TYPE': 'application/x-www-form-urlencoded',
'CSRF_COOKIE': 'yr6DWCqOS20JxulLxya1oMNcGZ0yff6C',
'HTTP_CONNECTION': 'close',
'HTTP_HOST': 'associadosapyb.herokuapp.com',
'HTTP_MAX_FORWARDS': '10',
'HTTP_USER_AGENT': 'Jakarta Commons-HttpClient/3.1',
'HTTP_VIA': '1.1 pagseguro.proxy.srv.intranet',
'HTTP_X_FORWARDED_FOR': '186.234.16.8',
'HTTP_X_FORWARDED_PORT': '80',
'HTTP_X_FORWARDED_PROTO': 'http',
'HTTP_X_HEROKU_DYNOS_IN_USE': '1',
'HTTP_X_HEROKU_QUEUE_DEPTH': '0',
'HTTP_X_HEROKU_QUEUE_WAIT_TIME': '0',
'HTTP_X_REQUEST_START': '1360153324974',
'PATH_INFO': u'/payment/notification/',
'QUERY_STRING': '',
'RAW_URI': '/payment/notification/',
'REMOTE_ADDR': '186.234.16.8',
'REMOTE_PORT': '80',
'REQUEST_METHOD': 'POST',
'SCRIPT_NAME': u'',
'SERVER_NAME': 'associadosapyb.herokuapp.com',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.1',
'SERVER_SOFTWARE': 'gunicorn/0.14.6',
'gunicorn.socket': <socket._socketobject object at 0x1e3c670>,
'wsgi.errors': <open file '<stderr>', mode 'w' at 0x7f1ef47f5270>,
'wsgi.file_wrapper': <class gunicorn.http.wsgi.FileWrapper at 0xf76a78>,
'wsgi.input': <gunicorn.http.body.Body object at 0x1f71c90>,
'wsgi.multiprocess': False,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)}>
o metodo de pegar o ultimo pagamento da associação não está certo, ele deveria validar se a há alguma transação como done. caso não houver deveria ver se há algum outro pagamento que se encaixa nesta siauação
usuários com CPFs diferentes conseguem se cadastrar com o mesmo endereço de e-mail
In [3]: settings.BASEDIR
Out[3]: '/home/cadu/prj/associados'
In [4]: execfile(BASEDIR + 'associados/settings_local.py')
após concatenação falta uma barra.
In [4]: execfile(BASEDIR + '/associados/settings_local.py') #sugestão
isso rola em outros ambientes ?
então nada do settings_local está disponível no meu ambiente.
Ajustar os estilos e markup do form para se adequar ao padrão de form do twitter bootstrap
Fica impossível fazer deploy no Heroku que usa PostgreSQL
$ ./manage.py migrate --settings=associados.settings_local
Running migrations for payment:
payment:0001_initial
FATAL ERROR - The following SQL query failed: ALTER TABLE "payment_paymenttype" ADD CONSTRAINT "category_id_refs_id_74ddaeeed229b12f" FOREIGN KEY ("category_id") REFERENCES "members_category" ("id") DEFERRABLE INITIALLY DEFERRED;
The error was: relation "members_category" does not exist
Error in migration: payment:0001_initial
Traceback (most recent call last):
File "./manage.py", line 10, in
execute_from_command_line(sys.argv)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/django/core/management/init.py", line 443, in execute_from_command_line
utility.execute()
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/django/core/management/init.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
self.execute(_args, *_options.dict)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
output = self.handle(_args, *_options)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/management/commands/migrate.py", line 108, in handle
ignore_ghosts = ignore_ghosts,
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/migration/init.py", line 213, in migrate_app
success = migrator.migrate_many(target, workplan, database)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/migration/migrators.py", line 235, in migrate_many
result = migrator.class.migrate_many(migrator, target, migrations, database)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/migration/migrators.py", line 310, in migrate_many
result = self.migrate(migration, database)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/migration/migrators.py", line 133, in migrate
result = self.run(migration)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/migration/migrators.py", line 107, in run
return self.run_migration(migration)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/migration/migrators.py", line 82, in run_migration
south.db.db.execute_deferred_sql()
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/db/generic.py", line 309, in execute_deferred_sql
self.execute(sql)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/south/db/generic.py", line 273, in execute
cursor.execute(sql, params)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/django/db/backends/util.py", line 40, in execute
return self.cursor.execute(sql, params)
File "/Users/osantana/Work/_Environments/associados/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
return self.cursor.execute(query, args)
django.db.utils.DatabaseError: relation "members_category" does not exist
travis.yml
in order to validate our previous testsrequirements.txt
fileO associado pode fazer login no sistema para verificar a situação da sua associação
O django já suporta TZ no entanto alguns testes estão fallhando :(
https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/
Criar uma interface para o usuário poder efetuar o cadastro na associação, a tela de cadastro deve ter os mesmo campos da interface atual:
Alguns associados fizeram registro após a lista de associados do sistema
antigo ser gerada, esse registro foi feito da maneira antiga, manual.
Precisa ser documentado ou elaborado um procedimento para regularizar a
situação desses associados.
Traceback (most recent call last):
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, _callback_args, *_callback_kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/generic/base.py", line 48, in view
return self.dispatch(request, _args, *_kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper
return bound_func(_args, *_kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 77, in wrapped_view
return view_func(_args, *_kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 21, in bound_func
return func(self, _args2, *_kwargs2)
File "/app/app/payment/views.py", line 128, in dispatch
return super(NotificationView, self).dispatch(_args, *_kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in dispatch
return handler(request, _args, *_kwargs)
File "/app/app/payment/views.py", line 133, in post
status, payment_id, price = self.transaction(self.transaction_code)
File "/app/app/payment/views.py", line 85, in transaction
referencia = int(dom.xpath("//reference")[0].text)
ValueError: invalid literal for int() with base 10: ‘Francisco Moreira de Miranda – 2013’
<WSGIRequest path:/payment/notification/, GET:<QueryDict: {}>, POST:<QueryDict: {u'notificationCode': [u'C96E73-1AD4E1D4E1F0-FBB4A2CFA1C1-885C92'], u'notificationType': [u'transaction']}>, COOKIES:{}, META:{'CONTENT_LENGTH': ‘85’,
O form utilizado para edião é o mesmo definido para Registro
e o form de registro defini Organization como CharField
organization = forms.CharField()
No modelo Member , o campo organization é uma FK para Organization
organization = models.ForeignKey(Organization, null=True, blank=True)
Pra mim isso não faz sentido, mesmo que fosse para manter uma base de empresas.
Atualizar a medida que usuários fazem cadastros não garante qualidade do dado (Globo , Gobo ...)
Prefiro deixar um campo aberto para edição. e deixar no Modelo Member o campo como charfield
Se eu pagar como estudante eu posso mudar para efetivo depois ?
Pq ai eu posso mudo para estudante pago R$ 20,00 e depois volto para efetivo 👎
algo como a interface admin do Django
atualmente o sistema só grava os status de transação feita ou cancelada, sera legal guardarmos todos os status para que a verificação seja feita somente pelo sistema
alterar o sistema de pagamento da apyb para que a notifiação seja um gateway para repassar para o site do evento da Pythonbrasil
URL_DE_API_CONFIGURADA_NO_PAGSEGURO = http://python.org.br/gateway/
Este gateway recebe o retorno do PagSeguro que vem acompanhado de um "ID" e outros dados.
O /gateway/ checa os dados do POST e decide se é da associação ou do evento e então dá baixa em um banco de dados, ou faz a chamada para as APIs respectivas
if request.POST.get("id_loja") == "evento":
requests.get("http://API/DO/EVENTO")
elif request.POST.get("id_loja") == "associacao":
requests.get("http://API/DA/ASSOCIACAO")
Ou obviamente coloca essas uris em um dict()
Mas a idéia por enquanto seria essa, apenas um gateway recebendo os retornos e redirecionando para a "loja" correta.
Aberto a pedido do Osvaldo.
Como consequencia deste erro, os alertas de vencimento da anuidade não serão enviados por email.
Depois que abri a issue anterior vi que temos outro problema também no tratamento do retorno do PagSeguro. Segue traceback:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/generic/base.py", line 48, in view
return self.dispatch(request, *args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 25, in _wrapper
return bound_func(*args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 77, in wrapped_view
return view_func(*args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/utils/decorators.py", line 21, in bound_func
return func(self, *args2, **kwargs2)
File "/app/app/payment/views.py", line 132, in dispatch
return super(NotificationView, self).dispatch(*args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in dispatch
return handler(request, *args, **kwargs)
File "/app/app/payment/views.py", line 138, in post
status, payment_id = self.transaction(notification_code)
File "/app/app/payment/views.py", line 94, in transaction
referencia = int(dom.xpath("//reference")[0].text)
ValueError: invalid literal for int() with base 10: 'Marcia Rodrigues - 2013'
<WSGIRequest
path:/payment/notification/,
GET:<QueryDict: {}>,
POST:<QueryDict: {u'notificationType': [u'transaction'], u'notificationCode': [u'AA9969-59502550254E-A0041C0F9097-4C0DDF']}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '85',
'CONTENT_TYPE': 'application/x-www-form-urlencoded',
'CSRF_COOKIE': '43SDBcuEapiAJtpQXr5ozARDgCX60tbO',
'HTTP_CONNECTION': 'close',
'HTTP_HOST': 'associadosapyb.herokuapp.com',
'HTTP_MAX_FORWARDS': '10',
'HTTP_USER_AGENT': 'Jakarta Commons-HttpClient/3.1',
'HTTP_VIA': '1.1 pagseguro.proxy.srv.intranet',
'HTTP_X_FORWARDED_FOR': '186.234.16.8',
'HTTP_X_FORWARDED_PORT': '80',
'HTTP_X_FORWARDED_PROTO': 'http',
'HTTP_X_HEROKU_DYNOS_IN_USE': '1',
'HTTP_X_HEROKU_QUEUE_DEPTH': '0',
'HTTP_X_HEROKU_QUEUE_WAIT_TIME': '0',
'HTTP_X_REQUEST_START': '1360142844071',
'PATH_INFO': u'/payment/notification/',
'QUERY_STRING': '',
'RAW_URI': '/payment/notification/',
'REMOTE_ADDR': '186.234.16.8',
'REMOTE_PORT': '80',
'REQUEST_METHOD': 'POST',
'SCRIPT_NAME': u'',
'SERVER_NAME': 'associadosapyb.herokuapp.com',
'SERVER_PORT': '80',
'SERVER_PROTOCOL': 'HTTP/1.1',
'SERVER_SOFTWARE': 'gunicorn/0.14.6',
'gunicorn.socket': <socket._socketobject object at 0x11d4c90>,
'wsgi.errors': <open file '<stderr>', mode 'w' at 0x7fe0974a5270>,
'wsgi.file_wrapper': <class gunicorn.http.wsgi.FileWrapper at 0xe0aa78>,
'wsgi.input': <gunicorn.http.body.Body object at 0x1308210>,
'wsgi.multiprocess': False,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)}>
Criar tela onde o usuário terá:
Enviar avisos de renovação com 30, 15 e 7 dias de antecedência do término.
Eu sugiro desvincular o pagamento do registro.
Deixar o pythonista se registrar sem efetuar o pagamento na hora.
Esse registro seria mantido por 3 meses, caso não haja nenhuma pagamento de nenhuma mensasalidade desde o cadastro do usuário, depois de 3 meses deletamos o registro do banco e o ususário tem que fazer um novo cadastro.
Simplifica o registro e caso haja algum problema para usuário pagar na hora ele não perde a visita ao site.
Por outro lado, nós podemos (com aviso prévio e sem permissão)
lembrá-lo que efetuou o registro no site mas que o pagamento ainda não foi feito.
Para os usuários que pagaram ao menos uma vez no passado, mantemos os registros até que alguém decida deletar numa outra ocasiao.
o form de atualização de usuário está atualizando a FK de cidades e organizações e cidades,
acho que a melhor abordagem é criar um widget q pega a FK e renderiza o nome, ou enTão fazemos isso por client
@osantana iria mudar o link no site da APyB para colocar o do novo sistema que implantou terça-feira, dia 23/4.
Mas notei um erro que achei problemático...
Testei o reset da minha senha (passo obrigatório) e estava ok.
Mas notei que o sistema colocou a minha data de associação (de anos pra trás) para hoje.
Pode verificar?
De preferência em Python :)
Ainda temos algumas warning causadas pela nova funcionalidade de timezones.
adicionar através de variaveis de ambiente, os dados do pagseguro, ara efeturar o pagamento da associação
Efetuei o pagamento no pagseguro pq o meu status estava como inválido, mas mesmo assim ele continuou como inválido.
Aberto a pedido do Osvaldo.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.