collections-app/cloud_backend.py
2025-09-06 19:07:26 -05:00

168 lines
5.8 KiB
Python

from PyQt5.QtWidgets import QDialog, QGridLayout, QLineEdit, QPushButton, QLabel, QVBoxLayout, QRadioButton
import requests, json
from PIL import Image
from io import BytesIO
import settings
import pathlib, os
global app_settings
app_settings = settings.app_settings
class LoginDialog(QDialog):
def __init__(self, parent):
super().__init__(parent)
self.setWindowTitle('Login')
self.grid_layout = QGridLayout()
self.server_address = QLineEdit()
self.server_address.setText(settings.app_settings.connected_server)
self.server_address_label = QLabel()
self.server_address_label.setText("Server")
self.username = QLineEdit()
self.username.setText(app_settings.username)
self.username_label = QLabel()
self.username_label.setText("Username")
self.password = QLineEdit()
self.password.setText(app_settings.password)
self.password_label = QLabel()
self.password_label.setText("Password")
self.connect_button = QPushButton()
self.connect_button.setText("Connect")
self.connect_button.clicked.connect(self.__login)
self.grid_layout.addWidget(self.server_address_label, 0, 0)
self.grid_layout.addWidget(self.server_address, 0, 1)
self.grid_layout.addWidget(self.username_label, 1, 0)
self.grid_layout.addWidget(self.username, 1,1)
self.grid_layout.addWidget(self.password_label, 2, 0)
self.grid_layout.addWidget(self.password, 2, 1)
self.grid_layout.addWidget(self.connect_button, 3, 1)
self.setLayout(self.grid_layout)
self.setFixedSize(300, 200)
self.user_data = {}
self.show()
def __login(self):
settings.app_settings.username = self.username.text()
settings.app_settings.password = self.password.text()
settings.app_settings.connected_server = self.server_address.text()
user_data = login(settings.app_settings.username, settings.app_settings.password)
if user_data != False:
self.user_data = user_data
with open('log.txt', 'w+') as file:
file.write(json.dumps(user_data))
self.accept()
def ping(url):
request = requests.get(url)
if request.status_code == 200:
return True
return False
def upload_file(filename, file_path, external_data: dict):
external_data['username'] = settings.app_settings.username
external_data['password'] = settings.app_settings.password
external_data['filename'] = filename
files = [
('file', ('file', open(file_path, 'rb'), 'application/octet')),
('datas', ('datas', json.dumps(external_data), 'application/json')),
]
r = requests.post(f"{settings.app_settings.connected_server}/upload_app", files=files)
def login(username, password):
headers = {'Content-Type': 'application/json'}
data = {
"username": username,
"password": password
}
response = requests.post(f"{settings.app_settings.connected_server}/login_app", headers=headers, json=data)
user_data = {}
if response.status_code == 200:
user_data = response.json()
settings.app_settings.username = username
settings.app_settings.password = password
response = requests.post(f"{settings.app_settings.connected_server}/login_app/avatar", json=data)
if response.status_code == 200:
im = Image.open(BytesIO(response.content))
path = settings.app_settings.external_path / "avatars" / f"{data['username']}_avatar.png"
print(path)
im.save(path)
user_data['avatar'] = str(path.absolute())
return user_data
user_data['avatar'] = f"icons/avatars/default_avatar.png"
return user_data
return False
class UpdateOptInDialog(QDialog):
def __init__(self, parent, default_pipeline):
super().__init__(parent)
self.default_pipeline = default_pipeline
self.setWindowTitle(f"Connectivity Opt In")
self.setMaximumWidth(300)
self.resize(300, 100)
self.vertical_layout = QVBoxLayout()
text = """This seems to be your first time loading this app and we have a important question to ask. That is; do you wish to opt into receiving update requests from our pipelines? If you choose not to then you will not be able to connect to any servers. This is in order to ensure that you stay upto date for those servers."""
self.message_label = QLabel()
self.message_label.setText(text)
self.message_label.setWordWrap(True)
self.message_label.setFixedSize(400, 100)
self.opt_in = QRadioButton()
self.opt_in.setText("I Want to Opt In to Updates")
self.opt_in.toggled.connect(self.radio_changed)
self.pipeline_edit = QLineEdit()
self.pipeline_edit.setEnabled(False)
self.confirm_button = QPushButton()
self.confirm_button.setText("Confirm")
self.confirm_button.setMaximumWidth(60)
self.confirm_button.setMaximumHeight(30)
self.confirm_button.clicked.connect(self.confirm_selection)
self.vertical_layout.addWidget(self.message_label)
self.vertical_layout.addWidget(self.opt_in)
self.vertical_layout.addWidget(self.pipeline_edit)
self.vertical_layout.addWidget(self.confirm_button)
self.setLayout(self.vertical_layout)
self.show()
def radio_changed(self, state):
if state:
self.pipeline_edit.setEnabled(True)
self.pipeline_edit.setText(self.default_pipeline)
if not state:
self.pipeline_edit.setEnabled(False)
self.pipeline_edit.setText("")
def get_opt_in_state(self):
return self.opt_in.isChecked()
def get_pipeline(self):
return self.pipeline_edit.text()
def confirm_selection(self):
self.accept()