Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: gunicorn githeart.wsgi
90 changes: 58 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,45 +1,71 @@
# PROJETO DE SELEÇÃO
# GitHeart

Ao conhecer uma pessoa que está aplicando para a Magrathea gostamos de ter uma conversa sobre código. Afinal, escrever, ler e discutir sobre código faz parte da nossa rotina diária de trabalho.
[Link para o app no Heroku](https://githeart.herokuapp.com/)

Você pode implementar o projeto usando qualquer linguagem de sua preferência. Lembre-se: use a linguagem com a qual você tem mais familiaridade.
O projeto escolhido foi o de adicionar Tags nos Repositórios favoritados por um determinado usuário do GitHub. O projeto foi desenvolvido em *Python*, utilizando o framework **Django**.

## O QUE VAMOS AVALIAR
Após ter clonado o repositório da aplicação e ativar o virtualenvironment, é necessário instalar os requisitos da aplicação utilizando o **pip**.

```bash
$ pip install -r requirements.txt
```

Queremos avaliar sua capacidade de fornecer um produto simples com documentação suficiente para outros desenvolvedores contribuírem ativamente para o projeto posteriormente. Na entrevista vamos prestar atenção nos seguintes itens:
Nesse projeto foi utilizado para gerenciar a database *githeart* o PostgreSQL. É preciso fazer as migrações para a database.

```bash
$ python manage.py makemigrations
$ python manage.py migrate
```

* Comunicação na revisão do código presencial;
* Argumentos sobre desafios enfrentados e escolhas realizadas na implementação;
## Estrutura do projeto

Ao revisar seu código vamos prestar atenção nos seguintes itens:
A estrutura do projeto ficou no seguinte formato. `githeart` é o nome do projeto. Um projeto pode ter várias aplicações, nesse caso possui a aplicação `starred_repos` o que torna o projeto `githeart` fácil de ser extendido para próximas versões.

```
template-projeto-selecao
└─── githeart
|___ __init__.py
|___ asgi.py
└─── settings.py
|___ urls.py
|___ wsgi.py
└─── starred_repos
|___ __init__.py
|___ admin.py
|___ apps.py
|___ forms.py
|___ models.py
|___ tests.py
|___ urls.py
|___ views
|___ __init__.py
|___ repositorios.py
|___ tags.py
|___ static
|___ templates
|___ manage.py
```

* Organização do código;
* Código bem escrito, limpo e coeso;
* Arquitetura e princípios de desenvolvimento;
* Documentação (README.md) com instruções claras para reproduzir o projeto;
* Uso adequado de versionamento do código em git;
* Uso de testes automatizados;
* Deploy da aplicação: recomendamos Heroku por ter plano free;
* O design da API RESTful é implementado, usando corretamente os verbos HTTP e o código de status apropriado;
* Uso adequado de HTML5, CSS3 e JavaScript em um front-end minimamente estruturado.
Dentro de `githeart` ficam as configurações de todo o projeto.

Caso você não se sinta confortável com algum desses itens, tudo bem, apenas nos fale sobre isso, ok? O objetivo aqui não é você programar de graça para nós, nem te fazer perder tempo com algo irrelevante. Nosso objetivo aqui é ter um código sobre o qual podemos conversar. Como você deve ter notado, a gente preza muito por colaboração, trabalho em time e comunicação. O objetivo aqui é ter, minimamente, essa experiência com você.
Dentro de `starred_repos` dois modelos foram criados:

- `GitHubRepo` é o modelo responsável por criar os repositórios favoritados no *GitHub* vindos da API do GitHub e que adiciona um campo para receber tags do tipo `Tag`
- `Tag` é o modelo responsável por criar essas tags.

Respeite o seu nível de conhecimento e experiência, o importante é você saber dizer o motivo das suas escolhas. Se você tiver qualquer dúvida, por favor, entre em contato com a gente. Se quiser uma revisão no seu código em um Pull Request no Github, pode nos chamar. Estamos disponíveis para te ajudar a finalizar esse processo.
Ah, por último. Você acha que consegue nos responder em quanto tempo? Duas semanas é ok para você?
É possível criar, adicionar, editar e deletar todas as tags, as funções para isso estão em `views/tags.py`.

## IDEIAS DE PROJETOS
As tags são adicionadas lado a lado utilizando vírgulas como separador, por exemplo: `Django,Python,API`

A seguir seguem algumas ideias de projetos que você pode implementar:
As funções responsáveis por buscar as informações na [API do GitHub](https://api.github.com/users/andressadotpy/starred) e armazenar na aplicação estão em `views/repositorios.py`.

* [Cliente para o GitHub](https://github.com/magrathealabs/template-projeto-selecao/blob/master/projects/GITHUB.md);
* [Cliente para o Twitter](https://github.com/magrathealabs/template-projeto-selecao/blob/master/projects/TWITTER.md);
* [Cliente para o Meetup](https://github.com/magrathealabs/template-projeto-selecao/blob/master/projects/MEETUP.md).
Para rodar localmente, a partir da pasta root do projeto:

```bash
$ python manage.py runserver
```

Tem alguma outra ideia? Tem algum projeto que já está pronto e gostaria de apresentar? Fale com a gente :)

## COMO COMPARTILHAR O PROJETO CONOSCO

1. Apague este README.md e adicione informações que achar relevante como configurar o projeto, contendo os comandos que devem ser executados para executar ele e os testes;
2. Abra um PR apontando para a branch master deste repositório;
3. Escreva qualquer consideração na descrição do PR e faça qualquer comentário que achar pertinente no código.
## Melhorias para uma segunda versão

- Deixar os repositórios em `home.html` em cards lado a lado.
- Melhorar o frontend no geral.
Empty file added githeart/__init__.py
Empty file.
16 changes: 16 additions & 0 deletions githeart/asgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
ASGI config for githeart project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'githeart.settings')

application = get_asgi_application()
139 changes: 139 additions & 0 deletions githeart/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
from pathlib import Path
import os
import django_heroku


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'oab#atjc&)godc&u9k7e1c81_v6^2-79k9wl80_-+ml!2q_jxa'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

INSTALLED_APPS = [
'requests',
'starred_repos',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'social_django',
]

TAGGIT_CASE_INSENSITIVE = True

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'social_django.middleware.SocialAuthExceptionMiddleware'
]

ROOT_URLCONF = 'githeart.urls'

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'social_django.context_processors.backends',
'social_django.context_processors.login_redirect'
],
},
},
]

WSGI_APPLICATION = 'githeart.wsgi.application'

DJANGO_SETTINGS_MODULE = 'githeart.settings'

# Database

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'githeart',
'USER': 'postgres',
'PASSWORD': '123',
'HOST': 'localhost'
}
}

AUTHENTICATION_BACKENDS = (
'social_core.backends.github.GithubOAuth2',
'django.contrib.auth.backends.ModelBackend',
)

AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]

# Internationalization

LANGUAGE_CODE = 'pt-br'

TIME_ZONE = 'America/Sao_Paulo'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'githeart/static')
]

from django.contrib.messages import constants as messages
MESSAGE_TAGS = {
messages.ERROR: 'danger',
messages.SUCCESS: 'success'
}

LOGIN_URL = 'login'
LOGOUT_URL = 'logout'
LOGIN_REDIRECT_URL = 'home'

# GitHub Login

SOCIAL_AUTH_GITHUB_KEY = '65a20aff8599424d2401'
SOCIAL_AUTH_GITHUB_SECRET = '1917f9ce2cc914a7935e8eca01fb4fa3d3d771e9'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'githeart/static')
]

django_heroku.settings(locals())
65 changes: 65 additions & 0 deletions githeart/static/css/tagsinput.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* bootstrap-tagsinput v0.8.0
*
*/

.bootstrap-tagsinput {
border: solid 1px #e9ecee;
border-radius: 0;
color: #8e9091;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
height: 48px;
padding: 8px 20px;
font-size: 16px;
}
.bootstrap-tagsinput input {
border: none;
border-radius: 0;
color: #8e9091;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;

}
.badge-tag{
background-color: #17a2b8;
color: white;
}
.bootstrap-tagsinput.form-control input::-moz-placeholder {
color: #777;
opacity: 1;
}
.bootstrap-tagsinput.form-control input:-ms-input-placeholder {
color: #777;
}
.bootstrap-tagsinput.form-control input::-webkit-input-placeholder {
color: #777;
}
.bootstrap-tagsinput input:focus {
border: none;
box-shadow: none;
}
.bootstrap-tagsinput .badge {
margin-left: 4px;
padding:8px;
}
.bootstrap-tagsinput .badge [data-role="remove"] {
margin-left: 8px;
cursor: pointer;
}
.bootstrap-tagsinput .badge [data-role="remove"]:after {
content: "×";
padding: 0px 4px;
background-color:rgba(0, 0, 0, 0.1);
border-radius:50%;
font-size:13px
}
.bootstrap-tagsinput .badge [data-role="remove"]:hover:after {

background-color:rgba(0, 0, 0, 0.62);}
.bootstrap-tagsinput .badge [data-role="remove"]:hover:active {
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
}

Loading