Create README; Set-Up Streamline
This commit is contained in:
33
README.md
Normal file
33
README.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# DualHub
|
||||||
|
### Der duale Studienplaner!
|
||||||
|
...
|
||||||
|
|
||||||
|
## INSTALLATION
|
||||||
|
### Voraussetzungen
|
||||||
|
Natürlich: Eine IDE und Python 3.x
|
||||||
|
### 1. Dieses Repo klonen
|
||||||
|
```
|
||||||
|
git clone https://git.paulmartin.cloud/SoftwareEngineering/DualHub.git
|
||||||
|
```
|
||||||
|
(oder per Version Control deiner IDE klonen)
|
||||||
|
|
||||||
|
### 2. Die nötigen Pakete installieren
|
||||||
|
```
|
||||||
|
pip install -r requirements.txt
|
||||||
|
pip install "flask[async]"
|
||||||
|
```
|
||||||
|
Achtung: Falls deine IDE ein VENV erstellt, zuerst:
|
||||||
|
```
|
||||||
|
venv\Scripts\activate
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Datenbank erstellen
|
||||||
|
#### 3.1. [MySQL installieren](https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/)
|
||||||
|
Benutzername und Passwort für DualHub können frei gewählt werden
|
||||||
|
#### 3.2. Datenbank erstellen
|
||||||
|
``` mysql
|
||||||
|
CREATE DATABASE paulmrtn_DUALHUB;
|
||||||
|
```
|
||||||
|
Achtung: Sicherstellen, dass der DualHub-User Schreib- und Leseberechtigungen hat!
|
||||||
|
#### 3.3. Zugangsdaten in get_mysql.py eintragen (nur Windows)
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ async def checkUser(email: str, password: str):
|
|||||||
Erhält von Dualis den Token und Cookie für User.
|
Erhält von Dualis den Token und Cookie für User.
|
||||||
:param email:
|
:param email:
|
||||||
:param password:
|
:param password:
|
||||||
:return (Token, Session):
|
:return (Token, Cookie):
|
||||||
"""
|
"""
|
||||||
async with httpx.AsyncClient() as s:
|
async with httpx.AsyncClient() as s:
|
||||||
fpw = urllib.parse.quote(password, safe='', encoding=None, errors=None)
|
fpw = urllib.parse.quote(password, safe='', encoding=None, errors=None)
|
||||||
@ -53,7 +53,7 @@ async def getKurs(token: int, cookie: str):
|
|||||||
try:
|
try:
|
||||||
headers["Cookie"] = "cnsc=" + cookie
|
headers["Cookie"] = "cnsc=" + cookie
|
||||||
token = str(token)
|
token = str(token)
|
||||||
async with httpx.AsyncClient as s:
|
async with httpx.AsyncClient() as s:
|
||||||
response = await s.get(url=f"{url}?APPNAME=CampusNet&PRGNAME=COURSERESULTS&ARGUMENTS=-N{token},-N000307,",
|
response = await s.get(url=f"{url}?APPNAME=CampusNet&PRGNAME=COURSERESULTS&ARGUMENTS=-N{token},-N000307,",
|
||||||
headers=headers)
|
headers=headers)
|
||||||
html = BeautifulSoup(response.text, 'lxml')
|
html = BeautifulSoup(response.text, 'lxml')
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import getpass
|
import getpass
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
def get_mysql():
|
def get_mysql():
|
||||||
@ -6,6 +7,7 @@ def get_mysql():
|
|||||||
Extrahiert die MySQL-Anmeldedaten aus ~/.my.cnf . \n
|
Extrahiert die MySQL-Anmeldedaten aus ~/.my.cnf . \n
|
||||||
Funktioniert wahrscheinlich nur auf Linux, vor allem für den Server gedacht.
|
Funktioniert wahrscheinlich nur auf Linux, vor allem für den Server gedacht.
|
||||||
"""
|
"""
|
||||||
|
if sys.platform == "linux":
|
||||||
u = getpass.getuser()
|
u = getpass.getuser()
|
||||||
f = open("/home/"+u+"/.my.cnf", "r")
|
f = open("/home/"+u+"/.my.cnf", "r")
|
||||||
i = f.read()
|
i = f.read()
|
||||||
@ -15,3 +17,5 @@ def get_mysql():
|
|||||||
ro = i.find("[clientreadonly]")
|
ro = i.find("[clientreadonly]")
|
||||||
p = i[p+9:ro-2]
|
p = i[p+9:ro-2]
|
||||||
return u, p
|
return u, p
|
||||||
|
else:
|
||||||
|
return "paulmrtn", "LQAlnY9YNXSJHBG5:9Ls"
|
||||||
|
|||||||
@ -1,6 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#Erstellt alle benötigten MySQL-Tabellen.
|
|
||||||
|
|
||||||
mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE user ( id int NOT NULL, email VARCHAR(255), name VARCHAR(255), kurs VARCHAR (15), PRIMARY KEY (ID), UNIQUE (ID, EMAIL) );"
|
|
||||||
mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE dualis ( uid int NOT NULL, token VARCHAR(255), result_list VARCHAR(15), token_created INT, PRIMARY KEY (uid));"
|
|
||||||
mysql -e "USE paulmrtn_DUALHUB; CREATE TABLE meals ( id int NOT NULL, date date, name VARCHAR(200), vegetarian tinyint(1), vegan tinyint(1), schwein tinyint(1), PRIMARY KEY (id));"
|
|
||||||
5
init.py
5
init.py
@ -75,7 +75,7 @@ class Meals(db.Model):
|
|||||||
"""
|
"""
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
date = db.Column(db.Date)
|
date = db.Column(db.Date)
|
||||||
name = db.Column(db.String(100))
|
name = db.Column(db.String(200))
|
||||||
vegetarian = db.Column(db.Boolean)
|
vegetarian = db.Column(db.Boolean)
|
||||||
vegan = db.Column(db.Boolean)
|
vegan = db.Column(db.Boolean)
|
||||||
schwein = db.Column(db.Boolean)
|
schwein = db.Column(db.Boolean)
|
||||||
@ -83,6 +83,9 @@ class Meals(db.Model):
|
|||||||
|
|
||||||
scheduler = APScheduler()
|
scheduler = APScheduler()
|
||||||
app = create()
|
app = create()
|
||||||
|
with app.app_context():
|
||||||
|
print("Creating Tables....")
|
||||||
|
db.create_all()
|
||||||
def_src = ["*.paulmartin.cloud", '\'self\'']
|
def_src = ["*.paulmartin.cloud", '\'self\'']
|
||||||
Talisman(app, content_security_policy={"default-src": def_src, "script-src": def_src # + ["'unsafe-inline'"]
|
Talisman(app, content_security_policy={"default-src": def_src, "script-src": def_src # + ["'unsafe-inline'"]
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,17 +1,20 @@
|
|||||||
beautifulsoup4~=4.12.2
|
beautifulsoup4
|
||||||
Flask~=3.0.3
|
Flask
|
||||||
Flask_APScheduler
|
Flask_APScheduler
|
||||||
Flask_Login
|
Flask_Login
|
||||||
flask_sqlalchemy
|
flask_sqlalchemy
|
||||||
icalendar~=5.0.11
|
icalendar
|
||||||
recurring_ical_events
|
recurring_ical_events
|
||||||
Requests~=2.31.0
|
|
||||||
talisman
|
talisman
|
||||||
Werkzeug~=3.0.0
|
Werkzeug
|
||||||
lxml
|
lxml
|
||||||
bs4~=0.0.1
|
bs4
|
||||||
pytz~=2023.3.post1
|
pytz
|
||||||
|
flask_talisman
|
||||||
asyncio~=3.4.3
|
asyncio
|
||||||
httpx~=1.0.0b0
|
httpx
|
||||||
celery~=5.4.0rc2
|
celery
|
||||||
|
flask[async]
|
||||||
|
pymysql
|
||||||
|
APScheduler
|
||||||
|
cryptography
|
||||||
@ -295,8 +295,7 @@ async def login_post():
|
|||||||
name = email[pname:pname + ename].capitalize()
|
name = email[pname:pname + ename].capitalize()
|
||||||
new_user = User(email=email, name=name, id=hashid)
|
new_user = User(email=email, name=name, id=hashid)
|
||||||
db.session.add(new_user)
|
db.session.add(new_user)
|
||||||
|
cookie = t[1]
|
||||||
cookie = requesthelpers.getCookie(t[1].cookies)
|
|
||||||
|
|
||||||
new_dualis = Dualis(uid=hashid, token=t[0], token_created=int(time.time()))
|
new_dualis = Dualis(uid=hashid, token=t[0], token_created=int(time.time()))
|
||||||
db.session.add(new_dualis)
|
db.session.add(new_dualis)
|
||||||
|
|||||||
@ -4,7 +4,6 @@
|
|||||||
<title>DualHub</title>
|
<title>DualHub</title>
|
||||||
<link rel="stylesheet" type="text/css" href={{ url_for("static", filename="style.css") }}>
|
<link rel="stylesheet" type="text/css" href={{ url_for("static", filename="style.css") }}>
|
||||||
<meta http-equiv="refresh" content="510">
|
<meta http-equiv="refresh" content="510">
|
||||||
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script>
|
|
||||||
{% block head %}
|
{% block head %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@ -4,7 +4,6 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Vorlesungsplan</title>
|
<title>Vorlesungsplan</title>
|
||||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='cal.css') }}">
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='cal.css') }}">
|
||||||
<script async src="https://analytics.paulmartin.cloud/script.js" data-website-id="459fa66e-e255-4393-8e89-ead8b1572d0d"></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<nav>
|
<nav>
|
||||||
|
|||||||
Reference in New Issue
Block a user