Skip to content
Snippets Groups Projects
Commit 516e5a84 authored by borzechof99's avatar borzechof99 :whale2:
Browse files

Merge branch '5-ci-einrichten' into 'master'

Resolve "CI einrichten"

Closes #5

See merge request swp-unisport/team-warumkeinrust/unisport-o-mat!34
parents c7e4fb20 b116e40d
No related branches found
No related tags found
No related merge requests found
......@@ -45,9 +45,11 @@ before_script:
#SOURCE: https://stephen-olabode.medium.com/running-black-formatter-to-lint-a-python-file-in-gitlab-ci-cd-ae80111ab363
black:
image: milansuk/python-black:latest
image: python:latest
before_script:
- pip install black
script:
- black --fast .
- black --check .
#SOURCE: https://pypi.org/project/pylint-gitlab/
pylint:
......@@ -57,23 +59,25 @@ pylint:
- python -V
- mkdir -p public/badges public/lint
- echo undefined > public/badges/$CI_JOB_NAME.score
- pip install pylint-gitlab
- pip install pylint-django
- pip install -r requirements.txt
script:
- pylint --exit-zero --output-format=text $(find -type f -name "*.py" ! -path "**/.venv/**") | tee /tmp/pylint.txt
- sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' /tmp/pylint.txt > public/badges/$CI_JOB_NAME.score
- pylint --exit-zero --output-format=pylint_gitlab.GitlabCodeClimateReporter $(find -type f -name "*.py" ! -path "**/.venv/**") > codeclimate.json
- pylint --exit-zero --output-format=pylint_gitlab.GitlabPagesHtmlReporter $(find -type f -name "*.py" ! -path "**/.venv/**") > public/lint/index.html
after_script:
- anybadge --overwrite --label $CI_JOB_NAME --value=$(cat public/badges/$CI_JOB_NAME.score) --file=public/badges/$CI_JOB_NAME.svg 4=red 6=orange 8=yellow 10=green
- |
echo "Your score is: $(cat public/badges/$CI_JOB_NAME.score)"
artifacts:
paths:
- public
reports:
codequality: codeclimate.json
when: always
#Due to Problems with Pylint, Ignored Files need to be presented here for now.
- ./custom_linter.sh
# - pylint --exit-zero --output-format=text $(find -type f -name "*.py" ! -path "**/.venv/**") | tee /tmp/pylint.txt
# - sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' /tmp/pylint.txt > public/badges/$CI_JOB_NAME.score
# - pylint --exit-zero --output-format=pylint_gitlab.GitlabCodeClimateReporter $(find -type f -name "*.py" ! -path "**/.venv/**") > codeclimate.json
# - pylint --exit-zero --output-format=pylint_gitlab.GitlabPagesHtmlReporter $(find -type f -name "*.py" ! -path "**/.venv/**") > public/lint/index.html
# after_script:
# - anybadge --overwrite --label $CI_JOB_NAME --value=$(cat public/badges/$CI_JOB_NAME.score) --file=public/badges/$CI_JOB_NAME.svg 4=red 6=orange 8=yellow 10=green
# - |
# echo "Your score is: $(cat public/badges/$CI_JOB_NAME.score)"
# artifacts:
# paths:
# - public
# reports:
# codequality: codeclimate.json
# when: always
#pages:
# stage: deploy
......
[MASTER]
fail-under=10
[MESSAGES CONTROL]
disable=line-too-long,
django-not-configured
git ls-files | grep -v 'migrations\|manage.py\|course_scraper' | grep -E '.py$' | xargs pylint --load-plugins=pylint_django
\ No newline at end of file
......@@ -6,6 +6,7 @@ for http://www.buchsys.de for SWP UniSport-O-Mat.
import requests
from bs4 import BeautifulSoup
def fetch_website(url):
"""
Helper function to fetch the content of a website.
......
......@@ -2,7 +2,7 @@
Testing module, yo. Just for the course_scraper.py.
"""
from django.test import TestCase
from course_scraper import scraping #, fetch_website
from course_scraper import scraping # , fetch_website
class ScraperTestCase(TestCase):
......@@ -10,6 +10,7 @@ class ScraperTestCase(TestCase):
Just a few tests, so pylint isn't getting a fit.
Because reasons.
"""
def test_returns_dict(self):
"""
Testing return type of scraping().
......
......@@ -6,7 +6,7 @@ import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'unisportomat.settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "unisportomat.settings")
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
......@@ -18,5 +18,5 @@ def main():
execute_from_command_line(sys.argv)
if __name__ == '__main__':
if __name__ == "__main__":
main()
# Generated by Django 3.2 on 2021-05-25 17:51
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="Question",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
],
),
migrations.CreateModel(
name="Sport",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"sportart",
models.TextField(
choices=[
("After Work Fitness", "After Work Fitness"),
("Ballett", "Ballett"),
("Basketball", "Basketball"),
("Beachvolleyball", "Beachvolleyball"),
("Bouldern", "Bouldern"),
("Drachenfliegen", "Drachenfliegen"),
("Functional Fitness", "Functional Fitness"),
("Gerätturnen", "Gerätturnen"),
("HIIT", "HIIT"),
("Karate", "Karate"),
("Kickboxen", "Kickboxen"),
("Laufen", "Laufen"),
("Pilates", "Pilates"),
("Qigong", "Qigong"),
("Rückenfit", "Rückenfit"),
(
"Segeln Sportbootführerschein",
"Segeln Sportbootführerschein",
),
(
"Skilanglauf & Schneeschuhwandern",
"Skilanglauf & Schneeschuhwandern",
),
("Sweat & Relax", "Sweat & Relax"),
("Tennis", "Tennis"),
("Ultimate Frisbee", "Ultimate Frisbee"),
("Yoga", "Yoga"),
]
),
),
(
"field",
models.CharField(
choices=[("indoor", "indoor"), ("outdoor", "outdoor")],
default="outdoor",
max_length=50,
),
),
(
"einzelsport",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"mannschaftssport",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"ausdauer",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"kraft",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"kampfsport",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"technischakrobatisch",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
("url", models.TextField()),
],
),
migrations.CreateModel(
name="Wissensnack",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
],
),
]
......@@ -7,86 +7,280 @@ import django.db.models.deletion
class Migration(migrations.Migration):
replaces = [('quiz', '0001_initial'), ('quiz', '0002_wissensnack_text'), ('quiz', '0003_auto_20210517_1437'), ('quiz', '0004_criterion'), ('quiz', '0005_auto_20210517_1520'), ('quiz', '0006_rename_criterion_ratings_sport_criteria_ratings'), ('quiz', '0007_auto_20210518_1521'), ('quiz', '0008_alter_sport_url')]
replaces = [
("quiz", "0001_initial"),
("quiz", "0002_wissensnack_text"),
("quiz", "0003_auto_20210517_1437"),
("quiz", "0004_criterion"),
("quiz", "0005_auto_20210517_1520"),
("quiz", "0006_rename_criterion_ratings_sport_criteria_ratings"),
("quiz", "0007_auto_20210518_1521"),
("quiz", "0008_alter_sport_url"),
]
initial = True
dependencies = [
]
dependencies = []
operations = [
migrations.CreateModel(
name='Sport',
name="Sport",
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.TextField(choices=[('After Work Fitness', 'After Work Fitness'), ('Ballett', 'Ballett'), ('Basketball', 'Basketball'), ('Beachvolleyball', 'Beachvolleyball'), ('Bouldern', 'Bouldern'), ('Drachenfliegen', 'Drachenfliegen'), ('Functional Fitness', 'Functional Fitness'), ('Gerätturnen', 'Gerätturnen'), ('HIIT', 'HIIT'), ('Karate', 'Karate'), ('Kickboxen', 'Kickboxen'), ('Laufen', 'Laufen'), ('Pilates', 'Pilates'), ('Qigong', 'Qigong'), ('Rückenfit', 'Rückenfit'), ('Segeln Sportbootführerschein', 'Segeln Sportbootführerschein'), ('Skilanglauf & Schneeschuhwandern', 'Skilanglauf & Schneeschuhwandern'), ('Sweat & Relax', 'Sweat & Relax'), ('Tennis', 'Tennis'), ('Ultimate Frisbee', 'Ultimate Frisbee'), ('Yoga', 'Yoga')])),
('field', models.CharField(choices=[('indoor', 'indoor'), ('outdoor', 'outdoor')], default='outdoor', max_length=50)),
('einzelsport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
('mannschaftssport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
('ausdauer', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
('kraft', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
('kampfsport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
('technischakrobatisch', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
('url', models.TextField()),
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"name",
models.TextField(
choices=[
("After Work Fitness", "After Work Fitness"),
("Ballett", "Ballett"),
("Basketball", "Basketball"),
("Beachvolleyball", "Beachvolleyball"),
("Bouldern", "Bouldern"),
("Drachenfliegen", "Drachenfliegen"),
("Functional Fitness", "Functional Fitness"),
("Gerätturnen", "Gerätturnen"),
("HIIT", "HIIT"),
("Karate", "Karate"),
("Kickboxen", "Kickboxen"),
("Laufen", "Laufen"),
("Pilates", "Pilates"),
("Qigong", "Qigong"),
("Rückenfit", "Rückenfit"),
(
"Segeln Sportbootführerschein",
"Segeln Sportbootführerschein",
),
(
"Skilanglauf & Schneeschuhwandern",
"Skilanglauf & Schneeschuhwandern",
),
("Sweat & Relax", "Sweat & Relax"),
("Tennis", "Tennis"),
("Ultimate Frisbee", "Ultimate Frisbee"),
("Yoga", "Yoga"),
]
),
),
(
"field",
models.CharField(
choices=[("indoor", "indoor"), ("outdoor", "outdoor")],
default="outdoor",
max_length=50,
),
),
(
"einzelsport",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"mannschaftssport",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"ausdauer",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"kraft",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"kampfsport",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
(
"technischakrobatisch",
models.IntegerField(
choices=[
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8),
(9, 9),
(10, 10),
],
default=1,
),
),
("url", models.TextField()),
],
),
migrations.CreateModel(
name='Criterion',
name="Criterion",
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.TextField()),
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.TextField()),
],
),
migrations.CreateModel(
name='CriterionRating',
name="CriterionRating",
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rating', models.IntegerField(validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)])),
('criterion', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.criterion')),
('sport', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.sport')),
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"rating",
models.IntegerField(
validators=[
django.core.validators.MaxValueValidator(10),
django.core.validators.MinValueValidator(0),
]
),
),
(
"criterion",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="quiz.criterion"
),
),
(
"sport",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="quiz.sport"
),
),
],
),
migrations.AddField(
model_name='sport',
name='criteria_ratings',
field=models.ManyToManyField(through='quiz.CriterionRating', to='quiz.Criterion'),
model_name="sport",
name="criteria_ratings",
field=models.ManyToManyField(
through="quiz.CriterionRating", to="quiz.Criterion"
),
),
migrations.RemoveField(
model_name='sport',
name='ausdauer',
model_name="sport",
name="ausdauer",
),
migrations.RemoveField(
model_name='sport',
name='einzelsport',
model_name="sport",
name="einzelsport",
),
migrations.RemoveField(
model_name='sport',
name='field',
model_name="sport",
name="field",
),
migrations.RemoveField(
model_name='sport',
name='kampfsport',
model_name="sport",
name="kampfsport",
),
migrations.RemoveField(
model_name='sport',
name='kraft',
model_name="sport",
name="kraft",
),
migrations.RemoveField(
model_name='sport',
name='mannschaftssport',
model_name="sport",
name="mannschaftssport",
),
migrations.RemoveField(
model_name='sport',
name='technischakrobatisch',
model_name="sport",
name="technischakrobatisch",
),
migrations.AlterField(
model_name='sport',
name='name',
model_name="sport",
name="name",
field=models.TextField(),
),
migrations.AlterField(
model_name='sport',
name='url',
model_name="sport",
name="url",
field=models.URLField(),
),
]
......@@ -11,6 +11,6 @@ import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'unisportomat.settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "unisportomat.settings")
application = get_asgi_application()
......@@ -20,7 +20,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-vl*o#be$=k)9mbtm3!8k!6pe&38cdfg1*#_y3s)kgp$czt4ctm'
SECRET_KEY = "django-insecure-vl*o#be$=k)9mbtm3!8k!6pe&38cdfg1*#_y3s)kgp$czt4ctm"
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
......@@ -31,53 +31,53 @@ ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = [
'quiz.apps.QuizConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"quiz.apps.QuizConfig",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
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',
"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",
]
ROOT_URLCONF = 'unisportomat.urls'
ROOT_URLCONF = "unisportomat.urls"
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"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",
],
},
},
]
WSGI_APPLICATION = 'unisportomat.wsgi.application'
WSGI_APPLICATION = "unisportomat.wsgi.application"
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
......@@ -87,16 +87,16 @@ DATABASES = {
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
......@@ -104,9 +104,9 @@ AUTH_PASSWORD_VALIDATORS = [
# Internationalization
# https://docs.djangoproject.com/en/3.2/topics/i18n/
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = "en-us"
TIME_ZONE = 'UTC'
TIME_ZONE = "UTC"
USE_I18N = True
......@@ -118,9 +118,9 @@ USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/
STATIC_URL = '/static/'
STATIC_URL = "/static/"
# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
......@@ -17,5 +17,5 @@ from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path("admin/", admin.site.urls),
]
......@@ -11,6 +11,6 @@ import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'unisportomat.settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "unisportomat.settings")
application = get_wsgi_application()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment