Compare commits

...

28 commits

Author SHA1 Message Date
v 82129b958e [tests] Remove twitter tests 2023-03-18 16:49:01 +01:00
v 20fdb1ae11 [tests] Prevent pytest from hanging 2023-03-18 16:49:01 +01:00
v 4c110e2c71 [misc] Cleanup python packaging 2023-03-18 16:49:01 +01:00
v fb543cffb9 [misc] Move things to the right place 2023-03-18 16:48:59 +01:00
ogdbd3h5qze42igcv8wcrqk3 aed5710da7 [frontend] Migrate to material 15 using mdc-migration 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 d1ffcf928d [frontend] Fix issue with ajv dependencies 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 005e4955ae [frontend] Version bump ngx-markdown to 15 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 76dcec3ae2 [frontend] Version bump angular/material to 15 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 038a4bf976 [frontend] Version bump angular/core and angular/cli to 15 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 401b4f32b1 [frontend] Version bump ngx-markdown to 14 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 8486ce8fab [frontend] Remove deprecated imports from angular/core 14 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 74fca41d66 [frontend] Version bump angular/material to 14 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 c9c1fe029b [frontend] Version bump angular/core and angular/cli to 14 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 cfb48cc0ff [frontend] Version bump ngx-markdown to 13 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 e3f5fbad44 [frontend] Remove deprecated Routes import from angular/core 13 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 b256aff872 [frontend] Version bump angular/material to 13 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 d9d75b76f2 [frontend] Version bump angular/core and angular/cli to 13 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 8ad6ce66fc [frontend] Version bump ngx-markdown to 12 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 5976db0cfc [frontend] Version bump angular/material to 12 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 4d5b1ee26e [frontend] Version bump angular/core and angular/cli to 12 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 ac00733847 [frontend] Version bump ngx-markdown to 11 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 c6c67463c9 [frontend] Version bump angular/material to 11 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 1824057e3e [frontend] Version bump angular/core and angular/cli to 11 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 6cb8a46f6c [frontend] Version bump angular/material to 10 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 5df8db657f [frontend] Version bump angular/core and angular/cli to 10 2023-03-18 16:25:20 +01:00
ogdbd3h5qze42igcv8wcrqk3 400f5af716 [frontend] Prerequisites for version bumps 2023-03-18 16:25:20 +01:00
Q d943e956ab [doc] Add missing dependencies 2023-03-18 14:34:42 +00:00
missytake 39a21fe34a [doc] No Gods, No Masters - let's do releases on development branch 2023-03-18 14:50:15 +01:00
345 changed files with 27104 additions and 14223 deletions

View file

@ -3,19 +3,18 @@
## Setup Development Environment
### General
1. Install `python>=3.10` and development packages
(`apt install python3-dev g++` on Ubuntu)
2. Run `./setup.sh`
### Backend
1. Install `python>=3.8`
2. Create a virtual environment with `python3 -m venv .venv`
3. Activate your dev environment with `source .venv/bin/activate`
4. Update pip packages with `pip install -U pip setuptools wheel`
5. Install with `pip install .`
6. Install development dependencies with `pip install tox black pytest pytest-aiohttp`
7. Add git-hook to run test and stylecheck before commmit with
`ln -s ../../git-hooks/pre-commit .git/hooks/pre-commit`
8. Add git-hook to check commmit message format with
`ln -s ../../git-hooks/commit-msg .git/hooks/commit-msg`
9. Turn off production mode: `sudo su -c 'echo "production = 0" >> /etc/kibicara.conf'`
0. `cd backend`
1. Activate your dev environment with `source .venv/bin/activate`
2. Install with `pip install .`
3. Turn off production mode: `sudo su -c 'echo "production = 0" >> /etc/kibicara.conf'`
#### Cheatsheet
@ -23,7 +22,7 @@
- Execute Kibicara with `kibicara` (verbose: `kibicara -vvv`)
- Interact with Swagger REST-API Documentation: `http://localhost:8000/api/docs`
- Test and stylecheck with `tox`
- Fix style issues with `black -S kibicara tests`
- Fix style issues with `black -S src tests`
### Frontend
@ -60,14 +59,9 @@ email address and register via frontend or manually at `http://localhost:8000/ap
## Contribution Guidelines
### Branches
- **Master:** The master branch tracks the last stable release.
- Releases will be done using release tags.
- Force push and pushes without group consent are disallowed.
- There never should be a merge commit from development into master!
- **Development:** The development branch is used to add new features.
- Only rebase of feature branches is allowed.
- On Release the development branch will be rebased onto master and a release
tag will be created on master
- On Release a release tag will be created
- **Feature-Branches:**
- A feature branch will be used to develop a feature.
- It belongs to one developer only and force push is allowed.

5
backend/README.md Normal file
View file

@ -0,0 +1,5 @@
# Kibicara backend
Kibicara relays messages between different platforms (= social networks).
This is just the backend. For info about the whole project see [our git
repo](https://git.0x90.space/ticketfrei/ticketfrei3).

6
backend/pyproject.toml Normal file
View file

@ -0,0 +1,6 @@
[build-system]
requires = [
"setuptools>=42",
"wheel"
]
build-backend = "setuptools.build_meta"

70
backend/setup.cfg Normal file
View file

@ -0,0 +1,70 @@
[metadata]
name = kibicara
version = 0.1.0
author = 0x90.space
author_email = people@schleuder.0x90.space
description = distribute messages across different social media
long_description = file: README.md
long_description_content_type = text/markdown
url = https://git.0x90.space/ticketfrei/ticketfrei3
project_urls =
Bug Tracker = https://git.0x90.space/ticketfrei/ticketfrei3/issues
classifiers =
Programming Language :: Python :: 3
License :: Public Domain
[options]
package_dir =
= src
packages = find:
python_requires = >=3.10
install_requires =
aiofiles
aiogram
aiosqlite
argon2_cffi
fastapi
httpx
hypercorn
ormantic @ https://github.com/dl6tom/ormantic/tarball/master#egg=ormantic-0.0.32
passlib
peony-twitter[all]
pynacl
python-multipart
pytoml
requests
scrypt
[options.packages.find]
where = src
[options.entry_points]
console_scripts =
kibicara = kibicara.kibicara:Main
kibicara_mda = kibicara.platforms.email.mda:Main
[tox:tox]
envlist = lint, py310
isolated_build = True
[testenv:lint]
skip_install = True
deps =
black
flake8
mypy
commands =
black -S --check --diff src tests
flake8 src tests
# not yet
#mypy src tests
[testenv]
deps =
pytest
pytest-asyncio
commands =
pytest tests
[flake8]
max_line_length = 88

View file

@ -32,6 +32,7 @@ speed-measure-plugin*.json
.history/*
# misc
/.angular/cache
/.sass-cache
/connect.lock
/coverage

View file

@ -22,7 +22,6 @@
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
"aot": true,
"assets": ["src/favicon.ico", "src/assets"],
"styles": [
"./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
@ -31,7 +30,13 @@
"stylePreprocessorOptions": {
"includePaths": ["src/sass"]
},
"scripts": []
"scripts": [],
"vendorChunk": true,
"extractLicenses": false,
"buildOptimizer": false,
"sourceMap": true,
"optimization": false,
"namedChunks": true
},
"configurations": {
"production": {
@ -44,7 +49,6 @@
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
@ -62,7 +66,8 @@
}
]
}
}
},
"defaultConfiguration": ""
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
@ -99,17 +104,6 @@
"scripts": []
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"tsconfig.app.json",
"tsconfig.spec.json",
"e2e/tsconfig.json"
],
"exclude": ["**/node_modules/**", "src/app/core/api/**"]
}
},
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
@ -124,6 +118,5 @@
}
}
}
},
"defaultProject": "kibicara-frontend"
}
}

View file

@ -3,7 +3,7 @@
"compilerOptions": {
"outDir": "../out-tsc/e2e",
"module": "commonjs",
"target": "es5",
"target": "es2018",
"types": [
"jasmine",
"jasminewd2",

View file

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

26775
frontend/package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

54
frontend/package.json Normal file
View file

@ -0,0 +1,54 @@
{
"name": "kibicara-frontend",
"version": "0.0.0",
"scripts": {
"openapi-generator": "openapi-generator generate -g typescript-angular --additional-properties=providedInRoot=true -o src/app/core/api -i http://localhost:8000/api/openapi.json",
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^15.2.3",
"@angular/cdk": "^15.2.3",
"@angular/common": "^15.2.3",
"@angular/compiler": "^15.2.3",
"@angular/core": "^15.2.3",
"@angular/forms": "^15.2.3",
"@angular/localize": "^15.2.3",
"@angular/material": "^15.2.3",
"@angular/platform-browser": "^15.2.3",
"@angular/platform-browser-dynamic": "^15.2.3",
"@angular/router": "^15.2.3",
"ng2-search-filter": "^0.5.1",
"rxjs": "~6.5.4",
"tslib": "^2.0.0",
"zone.js": "~0.11.4"
},
"devDependencies": {
"@angular-devkit/build-angular": "^15.2.4",
"@angular/cli": "^15.2.4",
"@angular/compiler-cli": "^15.2.3",
"@angular/language-service": "^15.2.3",
"@openapitools/openapi-generator-cli": "^1.0.18-5.0.0-beta2",
"@types/jasmine": "~3.6.0",
"@types/jasminewd2": "~2.0.3",
"@types/node": "^12.12.64",
"codelyzer": "^6.0.0",
"jasmine-core": "~3.6.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "~6.4.1",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"ngx-markdown": "^15.1.2",
"protractor": "~7.0.0",
"ts-node": "~8.3.0",
"tslint": "~6.1.0",
"typescript": "~4.9.5"
}
}

View file

@ -28,7 +28,7 @@ const routes: Routes = [
];
@NgModule({
imports: [RouterModule.forRoot(routes), SharedModule],
imports: [RouterModule.forRoot(routes, {}), SharedModule],
exports: [RouterModule],
})
export class AppRoutingModule {}

View file

@ -1,9 +1,9 @@
import { TestBed, async } from '@angular/core/testing';
import { TestBed, waitForAsync } from '@angular/core/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async(() => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule

View file

@ -1,4 +1,4 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { ConfirmComponent } from './confirm.component';
@ -6,7 +6,7 @@ describe('ConfirmComponent', () => {
let component: ConfirmComponent;
let fixture: ComponentFixture<ConfirmComponent>;
beforeEach(async(() => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ ConfirmComponent ]
})

View file

@ -1,5 +1,5 @@
<div class="container">
<mat-card class="login-form">
<mat-card appearance="outlined" class="login-form">
<mat-card-header>
<h2>Log in as hood admin!</h2>
</mat-card-header>

View file

@ -7,7 +7,7 @@
margin-top: 3%;
}
.mat-card:not([class*="mat-elevation-z"]) {
.mat-mdc-card:not([class*="mat-elevation-z"]) {
box-shadow: none;
}

View file

@ -1,4 +1,4 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { LoginComponent } from './login.component';
@ -6,7 +6,7 @@ describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
beforeEach(async(() => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ LoginComponent ]
})

View file

@ -1,7 +1,7 @@
import { Component, OnInit } from '@angular/core';
import { LoginService } from '../../core/auth/login.service';
import { Router, ActivatedRoute } from '@angular/router';
import { Validators, FormGroup, FormBuilder } from '@angular/forms';
import { Validators, UntypedFormGroup, UntypedFormBuilder } from '@angular/forms';
import { first } from 'rxjs/operators';
import { MatSnackBar } from '@angular/material/snack-bar';
@ -11,7 +11,7 @@ import { MatSnackBar } from '@angular/material/snack-bar';
styleUrls: ['./login.component.scss'],
})
export class LoginComponent implements OnInit {
loginForm: FormGroup;
loginForm: UntypedFormGroup;
returnUrl: string;
loading = false;
submitted = false;
@ -21,7 +21,7 @@ export class LoginComponent implements OnInit {
private loginService: LoginService,
private router: Router,
private route: ActivatedRoute,
private formBuilder: FormBuilder,
private formBuilder: UntypedFormBuilder,
private snackBar: MatSnackBar
) {
if (this.loginService.currentHoodAdminValue) {

View file

@ -1,5 +1,5 @@
<div class="container">
<mat-card class="login-form">
<mat-card appearance="outlined" class="login-form">
<mat-card-header>
<h2>Reset password</h2>
</mat-card-header>

View file

@ -6,7 +6,7 @@
margin-top: 3%;
}
.mat-card:not([class*="mat-elevation-z"]) {
.mat-mdc-card:not([class*="mat-elevation-z"]) {
box-shadow: none;
}

View file

@ -1,4 +1,4 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { PasswordResetComponent } from './password-reset.component';
@ -6,7 +6,7 @@ describe('PasswordResetComponent', () => {
let component: PasswordResetComponent;
let fixture: ComponentFixture<PasswordResetComponent>;
beforeEach(async(() => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [PasswordResetComponent],
}).compileComponents();

View file

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { MatSnackBar } from '@angular/material/snack-bar';
import { ActivatedRoute, Router } from '@angular/router';
import { first } from 'rxjs/operators';
@ -12,7 +12,7 @@ import { LoginService } from 'src/app/core/auth/login.service';
styleUrls: ['./password-reset.component.scss'],
})
export class PasswordResetComponent implements OnInit {
resetForm: FormGroup;
resetForm: UntypedFormGroup;
returnUrl: string;
loading = false;
submitted = false;
@ -23,7 +23,7 @@ export class PasswordResetComponent implements OnInit {
private loginService: LoginService,
private router: Router,
private route: ActivatedRoute,
private formBuilder: FormBuilder,
private formBuilder: UntypedFormBuilder,
private snackBar: MatSnackBar
) {
if (this.loginService.currentHoodAdminValue) {

View file

@ -1,5 +1,5 @@
<div class="container">
<mat-card class="login-form">
<mat-card appearance="outlined" class="login-form">
<mat-card-header>
<h2>Enter your new password</h2>
</mat-card-header>

View file

@ -6,7 +6,7 @@
margin-top: 3%;
}
.mat-card:not([class*="mat-elevation-z"]) {
.mat-mdc-card:not([class*="mat-elevation-z"]) {
box-shadow: none;
}

View file

@ -1,4 +1,4 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { SetPasswordComponent } from './set-password.component';
@ -6,7 +6,7 @@ describe('SetPasswordComponent', () => {
let component: SetPasswordComponent;
let fixture: ComponentFixture<SetPasswordComponent>;
beforeEach(async(() => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [SetPasswordComponent],
}).compileComponents();

View file

@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { MatSnackBar } from '@angular/material/snack-bar';
import { ActivatedRoute, Router } from '@angular/router';
import { first } from 'rxjs/operators';
@ -12,7 +12,7 @@ import { LoginService } from 'src/app/core/auth/login.service';
styleUrls: ['./set-password.component.scss'],
})
export class SetPasswordComponent implements OnInit {
resetForm: FormGroup;
resetForm: UntypedFormGroup;
returnUrl: string;
loading = false;
submitted = false;
@ -24,7 +24,7 @@ export class SetPasswordComponent implements OnInit {
private loginService: LoginService,
private router: Router,
private route: ActivatedRoute,
private formBuilder: FormBuilder,
private formBuilder: UntypedFormBuilder,
private snackBar: MatSnackBar
) {
this.token = this.route.snapshot.queryParams.token;

View file

@ -1,6 +1,6 @@
<div class="container">
<div class="banner"></div>
<mat-card class="register-form">
<mat-card appearance="outlined" class="register-form">
<mat-card-header>
<h2>Register as a hood admin!</h2>
</mat-card-header>

View file

@ -7,7 +7,7 @@
margin-top: 3%;
}
.mat-card:not([class*="mat-elevation-z"]) {
.mat-mdc-card:not([class*="mat-elevation-z"]) {
box-shadow: none;
}

View file

@ -1,4 +1,4 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { RegisterComponent } from './register.component';
@ -6,7 +6,7 @@ describe('RegisterComponent', () => {
let component: RegisterComponent;
let fixture: ComponentFixture<RegisterComponent>;
beforeEach(async(() => {
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ RegisterComponent ]
})

View file

@ -1,6 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { AdminService } from '../../core/api';
import { Validators, FormBuilder, FormGroup } from '@angular/forms';
import { Validators, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { first } from 'rxjs/operators';
import { Router, ActivatedRoute } from '@angular/router';
import { LoginService } from 'src/app/core/auth/login.service';
@ -12,13 +12,13 @@ import { MatSnackBar } from '@angular/material/snack-bar';
styleUrls: ['./register.component.scss'],
})
export class RegisterComponent implements OnInit {
registerForm: FormGroup;
registerForm: UntypedFormGroup;
loading = false;
submitted = false;
constructor(
private readonly adminService: AdminService,
private formBuilder: FormBuilder,
private formBuilder: UntypedFormBuilder,
private route: ActivatedRoute,
private loginService: LoginService,
private router: Router,

Some files were not shown because too many files have changed in this diff Show more