GithubHelp home page GithubHelp logo

apyb / associados Goto Github PK

View Code? Open in Web Editor NEW
105.0 105.0 50.0 1.98 MB

Controle de associados a Associação PythonBrasil

Home Page: https://associacao.python.org.br/

Python 36.84% Shell 0.33% CSS 5.40% Makefile 1.35% HTML 19.95% JavaScript 0.15% Dockerfile 0.07% Less 35.90% Procfile 0.01%

associados's Introduction

APyB

Build Status Coverage Status

Novo site da Associação Python Brasil

Ambiente de desenvolvimento

Durante o desenvolvimento, você pode utilizar pip ou pipenv ou mesmo virtualenvwrapper.

  1. Crie o virtualenv com sua ferramenta favorita.
  2. Instale as dependências de desenvolvimento com pip install -r requirements-dev.txt ou, se estiver usando pipenv, utilize pipenv install -r requirements-dev.txt.
  3. Para iniciar o servidor, utilize python manage.py runserver; manage.py se encontra dentro do diretório apyb.

Este projeto utiliza EditorConfig para manter o padrão dos editores. Verifique se o seu tem suporte embutido ou se você precisa instalar algum plugin.

Instalação

Requisitos

Local

Python >=3.7 PostgreSQL >=10.5

Docker

docker-ce >=18

Gerando as imagens locais necessárias
docker-compose build
Executando dentro do container em primeiro plano
docker-compose up
Executando em segundo plano
docker-compose up -d
Estrutura do docker
container serviço
ngapyb nginx
psapyb postgresql
dgapyb gunicorn

associados's People

Contributors

barmvicente avatar cadu-leite avatar cuducos avatar dependabot[bot] avatar ellisonleao avatar elyezer avatar emyller avatar feliperuhland avatar fgmacedo avatar filipecifali avatar gabrielponto avatar humrochagf avatar jamesperes avatar jtemporal avatar lskbr avatar mazulo avatar mondaini avatar muriloviana avatar osantana avatar perone avatar petry avatar ramiroluz avatar romulocollopy avatar rougeth avatar taniaa avatar tyronedamasceno avatar valdergallo avatar viniciusban avatar vmesel avatar vractal avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

associados's Issues

Erro no tratamento do retorno do PagSeguro

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)}>

Erro no tratamento do retorno do PagSeguro (outro problema)

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)}>

Status da Associação

Efetuei o pagamento no pagseguro pq o meu status estava como inválido, mas mesmo assim ele continuou como inválido.

Cadastro de usuário não permite cadastrar duas pessoas com mesmo nome

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__

Migrations scripts com problemas em PostgreSQL

Fica impossível fazer deploy no Heroku que usa PostgreSQL

$ ./manage.py migrate --settings=associados.settings_local
Running migrations for payment:

  • Migrating forwards to 0005_auto__add_field_transaction_date.

    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

Signup por email

aplicar a mudança do Cadu em #28 e #30 e alterar o form de signup para para logar-se por email

Erro ao processar retorno do PagSeguro

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’,

i18n

realizar umn "pente fino" no projeto, buscando mensagens sem suporte a tradução

Procedimento para importar associados novos do sistema antigo.

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.

Erro de conversão para inteiro no retorno do PagSeguro

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’,

status do associado inválido

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

desvincular o pagamento do registro

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.

gravar todas as notificações no pagseguro

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

senha do usuário cadastrado

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:

  1. Adicionar a senha na tela de registro
  2. Mandar a senha por email no final do cadastro

qual a melhor abordagem?

member: Organization é FK para member ?

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

Warnings em testes

Ainda temos algumas warning causadas pela nova funcionalidade de timezones.

Experiencia logada

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

gateway de notificação de pagamento

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.

Form de atualizaçào de dados está renderizando FKs

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

Dashboard do usuário

Criar tela onde o usuário terá:

  • visualizar suas informações pessoais
  • visualizar informações relativas a associação
  • link para troca de senha
  • link para pagamento de associação caso a mesma ainda não tenha sido paga
  • link para edição de dados fornecidos a associação

Criar página inicial

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

Corrigir data de associação ao redefinir senha

@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?

settings_local.py não é "executado" - path not found

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.