add provider in to scrollview

This commit is contained in:
Björn Ruthotto 2024-10-08 12:03:22 +02:00
parent 62f42e61a9
commit 56fc70dfe0
5 changed files with 155 additions and 43 deletions

Binary file not shown.

View File

@ -1,56 +1,125 @@
import customtkinter as ctk
from views.mainScreen import MainFrame from views.mainScreen import MainFrame
from models.data import TextData from models.data import TextData
from Ai.interence import VeraMindInference from Ai.interence import VeraMindInference
from utils.database.database import FakeNewsChecker from utils.database.database import FakeNewsChecker
from urllib.parse import urlparse from models.provider import Provider
from collections import Counter
class MainFrameController: class MainFrameController:
"""
def __init__(self,frame:MainFrame) -> None: Controller class for the main frame of the application.
Handles user interactions, data processing, and database operations.
"""
def __init__(self, frame: MainFrame) -> None:
"""
Initialize the controller with the main frame and required components.
:param frame: The main frame of the application
"""
self.frame = frame self.frame = frame
self.model_inference = VeraMindInference('VeraMind-Mini') self.model_inference = VeraMindInference('VeraMind-Mini')
self.db = FakeNewsChecker() self.db = FakeNewsChecker()
self._fetch_db_data()
def get_textdata(self) -> TextData: self.update_provider_list()
def get_text_data(self) -> TextData:
"""
Retrieve text data from the UI input fields.
:return: TextData object containing URL and text content
"""
text_data = TextData() text_data = TextData()
text_data.url = self.frame.entry_url.get() text_data.url = self.frame.entry_url.get()
if text_data.text_from_url(): if not text_data.text_from_url():
text_data.text = self.frame.input_textbox.get("0.0", "end") text_data.text = self.frame.input_textbox.get("0.0", "end")
return text_data return text_data
def press_check_button(self): def press_check_button(self) -> None:
text_data = self.get_textdata() """
print(f"text:{text_data.text}") Handle the 'Check' button press event.
text_data = self.prediction(text_data) Processes the input, makes a prediction, updates the database, and displays the result.
"""
self.addDB(textData=text_data) text_data = self.get_text_data()
self.frame.output_textbox.configure(state="normal") text_data = self._predict(text_data)
self.frame.output_textbox.delete("0.0", "end") self._add_to_db(text_data)
self.frame.output_textbox.insert("0.0",f"{text_data.get_output()}") self._update_output(text_data.get_output())
self.frame.output_textbox.configure(state="disabled") self.update_provider_list()
def prediction(self, text_data:TextData) -> TextData: def _predict(self, text_data: TextData) -> TextData:
"""
Make a prediction using the VeraMind model.
:param text_data: TextData object containing the text to analyze
:return: Updated TextData object with prediction results
"""
result = self.model_inference.predict(text_data.text) result = self.model_inference.predict(text_data.text)
text_data.confidence = result["confidence"] text_data.confidence = result["confidence"]
text_data.result = result["result"] text_data.result = result["result"]
text_data.is_fake_news = result["is_fake"] text_data.is_fake_news = result["is_fake"]
print(f"Prediction: {text_data.result}") print(f"Prediction: {text_data.result}")
print(f"Confidence: {text_data.confidence}") print(f"Confidence: {text_data.confidence}")
return text_data return text_data
def addDB(self, textData: TextData): def _add_to_db(self, text_data: TextData) -> None:
if self.is_valid_url(textData.url): """
parsed_url = urlparse(textData.url) Add the analyzed data to the database.
anbieter = parsed_url.netloc.split('.')[-2] + '.' + parsed_url.netloc.split('.')[-1]
print("Hauptdomain:", anbieter) :param text_data: TextData object containing the analyzed information
self.db.insert_data(url= textData.url, anbieter= anbieter,is_fake_news=textData.is_fake_news) """
else:
self.db.insert_data(url= textData.url, anbieter= "None",is_fake_news=textData.is_fake_news) self.db.insert_data(url=text_data.url, anbieter=text_data.get_provider(), is_fake_news=text_data.is_fake_news)
def is_valid_url(self, url): def _fetch_db_data(self):
try: self.text_data_list = []
result = urlparse(url) data = self.db.fetch_data()
return all([result.scheme, result.netloc]) if data:
except ValueError: for row in data:
return False print(f"ID: {row[0]}, URL: {row[1]}, Anbieter: {row[2]}, Fake News: {'Ja' if row[3] else 'Nein'}")
text_data = TextData(url=row[1], provider=row[2], is_fake_news= row[3])
self.text_data_list.append(text_data)
def sort_provider(self, text_data_list):
provider_names = [text_data.provider for text_data in text_data_list if text_data.provider]
provider_counts = Counter(provider_names)
sorted_providers = [
Provider(name, count)
for name, count in sorted(provider_counts.items(), key=lambda x: x[1], reverse=True)
]
return sorted_providers
def update_provider_list(self):
self._fetch_db_data()
# Lösche vorhandene Einträge in der scrollbaren Ansicht
for widget in self.frame.provider_container.winfo_children():
widget.destroy()
# Sortiere und zähle die Provider
sorted_providers = self.sort_provider(self.text_data_list)
# Füge die sortierten Provider zur scrollbaren Ansicht hinzu
for i, provider in enumerate(sorted_providers):
provider_frame = ctk.CTkFrame(self.frame.provider_container)
provider_frame.pack(fill="x", padx=5, pady=2)
name_label = ctk.CTkLabel(provider_frame, text=provider.title)
name_label.pack(side="left", padx=5)
count_label = ctk.CTkLabel(provider_frame, text=str(provider.count))
count_label.pack(side="right", padx=5)
def _update_output(self, output: str) -> None:
"""
Update the output text box with the result.
:param output: String containing the output to display
"""
self.frame.output_textbox.configure(state="normal")
self.frame.output_textbox.delete("0.0", "end")
self.frame.output_textbox.insert("0.0", output)
self.frame.output_textbox.configure(state="disabled")

View File

@ -1,11 +1,15 @@
from urllib.parse import urlparse
from typing import Optional
from utils.webTextExtractor import WebTextExtractor from utils.webTextExtractor import WebTextExtractor
class TextData: class TextData:
def __init__(self, url: str = "") -> None: def __init__(self, url: str = "",text: str = "",result: str = "", is_fake_news: bool = False, provider: str = "") -> None:
self.url = url self.url = url
self.text = "" self.text = text
self.result = "" self.result = result
self.is_fake_news = False self.is_fake_news = is_fake_news
self.provider = provider
self.confidence = None self.confidence = None
self._extractor = None self._extractor = None
@ -32,4 +36,34 @@ class TextData:
if self.confidence != None: if self.confidence != None:
output = f"Prediction: {self.result}" + f" Confidence: {self.confidence:.4f}" output = f"Prediction: {self.result}" + f" Confidence: {self.confidence:.4f}"
print(output) print(output)
return output return output
def get_provider(self)-> str:
self.extract_provider()
return self.provider
def extract_provider(self):
"""
Extract the domain (anbieter) from a given URL.
:param url: The URL to process
:return: The extracted domain or None if the URL is invalid
"""
if not self._is_valid_url(self.url):
self.provider = "None"
parsed_url = urlparse(self.url)
domain_parts = parsed_url.netloc.split('.')
self.provider = f"{domain_parts[-2]}.{domain_parts[-1]}" if len(domain_parts) >= 2 else "None"
def _is_valid_url(self, url: str) -> bool:
"""
Check if a given URL is valid.
:param url: The URL to validate
:return: True if the URL is valid, False otherwise
"""
try:
result = urlparse(url)
return all([result.scheme, result.netloc])
except ValueError:
return False

5
src/models/provider.py Normal file
View File

@ -0,0 +1,5 @@
class Provider():
def __init__(self, title: str, count: int) -> None:
self.title = title
self.count = count

View File

@ -38,6 +38,10 @@ class MainFrame(ctk.CTkFrame):
self.header = ctk.CTkLabel(self.scrollview, text="Leaderboard", font=("Arial", 24, "bold")) self.header = ctk.CTkLabel(self.scrollview, text="Leaderboard", font=("Arial", 24, "bold"))
self.header.pack(pady=10, padx=10, anchor="w") self.header.pack(pady=10, padx=10, anchor="w")
# Container für Provider-Einträge
self.provider_container = ctk.CTkFrame(self.scrollview)
self.provider_container.pack(fill="both", expand=True)
def set_controller(self, controller): def set_controller(self, controller):
self.controller = controller self.controller = controller