Skip to content
Snippets Groups Projects
Commit 7e91ac14 authored by Christophorus Dharma Winata's avatar Christophorus Dharma Winata
Browse files

feat: Journal (list and input)

parent 6071cdcd
Branches
Tags
2 merge requests!13final push for dev to main,!3feat: Journal (list and input)
Id,IsiJournal,JudulJournal"20230419","Journal tidak kosong","Title20230419"
"20230419","nama saya bundar","Title20230419"
"20230419","waddawlidjaujikdhaiuohduayhdiap nama saya bunar","Title20230419"
import datetime
class Journal:
def __init__(self, journalElems : list[str]): # input as csv (headers: ID, content, title)
self.ID = journalElems[0]
self.content = journalElems[1]
self.title = journalElems[2]
def __str__(self):
return (' '.join([self.ID, self.content, self.title]))
def getID(self):
return self.ID
def getContent(self):
return self.content
def getTitle(self):
return self.title
def IDtoDatetime(self):
dtstr12char = self.ID
hari = dtstr12char[0]+dtstr12char[1]
bulan = dtstr12char[2]+dtstr12char[3]
tahun = dtstr12char[4]+dtstr12char[5]+dtstr12char[6]+dtstr12char[7]
ret = datetime.datetime(int(tahun),int(bulan),int(hari))
return ret
def DatetimeToID(ID=datetime.datetime.now()):
ret = "%04d%02d%02d" % (
ID.year,
ID.month,
ID.day
# ID.hour,
# ID.minute
)
return ret
def setID(self, ID=DatetimeToID()):
ret = ID
self.ID = ret
def setContent(self, content="<EMPTY>"):
ret = content
self.content = ret
def setTitle(self,title="<NOTITLE>"):
ret = title
self.title = ret
# Journal constructor from keyboard input
# @returns Journal object
def makeJournal():
title = input()
content = input()
ret = Journal([Journal.DatetimeToID(), content, title])
return ret
def toCSV(self):
return [self.ID, self.content.replace('\n','\\n').replace('\t','\\t'), self.title]
\ No newline at end of file
import csv
import Journal.Journal as Journal
class JournalDatabase:
DATABASE_HEADER = ["Id","IsiJournal","JudulJournal"]
DATABASE_ITR = 0
def __init__(self):
self.filename = './Journal/Journal.csv'
with open(self.filename, 'r') as file:
csvreader = csv.reader(file, lineterminator="\n")
next(csvreader) # Skip header row
self.journals = [Journal.Journal(row) for row in csvreader]
def showJournals(self):
for i in self.journals:
print(i)
def addJournal(self, journal):
with open(self.filename, 'a') as file:
csvwriter = csv.writer(file, quoting=1, lineterminator="\n")
csvwriter.writerow(journal)
def clearJournal(self):
with open(self.filename, 'w') as file:
csvwriter = csv.writer(file, lineterminator="\n")
csvwriter.writerow(self.DATABASE_HEADER)
def isEmpty(self):
return len(self.journals) == 0
def findJournal(self, ID):
for i in reversed(self.journals):
if i.getID() == ID:
return i.getContent()
return None
# Example
# ctor journals: membaca journal, dengan letak file yang sudah ditentukan
# awal penggunaan journals, csv-nya akan kosong (hanya ada header)
# tempJournals = Journals()
# tempJournals.showJournals()
# menambahkan 1 objek journal yang sudah disusun menyesuaikan format csv
# makejournal() adalah fungsi menerima input journal dengan input keyboard via CLI
# tempJournals.addJournal(Journal.makeJournal().toCSV())
\ No newline at end of file
import Journal.Journal_rc
import Journal.JournalInput_GUI as uw
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout,QSizePolicy
import sys
from PyQt5 import QtWidgets
from datetime import date, datetime
import Journal.JournalDatabase as JournalDatabase
from tkinter import messagebox
from Journal.Journal import Journal as jrn
class Journal_GUI_Call(QWidget, uw.JournalInput):
def __init__(self):
super().__init__()
self.setupUi(self)
self.DB = JournalDatabase.JournalDatabase()
self.SubmitButton.clicked.connect(self.addToJournalDB)
self.backButton.clicked.connect(self.backToHome)
def addToJournalDB(self):
if self.JournalContent.toPlainText().strip()=="":
# do nothing
messagebox.showinfo("Failed", "Konten Jurnal kosong.")
else :
addedContent = jrn([jrn.DatetimeToID(),self.JournalContent.toPlainText(),"Title"+jrn.DatetimeToID()])
self.DB.addJournal(addedContent.toCSV())
messagebox.showinfo("Success", "Konten Jurnal ditambahkan.")
self.backToHome()
def backToHome(self):
from MainMenu.main_menu_GUI import Main_Menu_GUI
self.main_menu = Main_Menu_GUI()
self.main_menu.show()
self.hide()
# app = QtWidgets.QApplication(sys.argv)
# window = Journal_GUI_Call()
# window.show()
# sys.exit(app.exec_())
\ No newline at end of file
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/qtjournalinput.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
import MainMenu.mainmenu as main
class JournalInput(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1366, 720)
MainWindow.setMinimumSize(QtCore.QSize(800, 600))
MainWindow.setMaximumSize(QtCore.QSize(1920, 1080))
MainWindow.setAutoFillBackground(False)
MainWindow.setStyleSheet(f"background-image: url({main.image_path});")
# MainWindow.setAnimated(True)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setMinimumSize(QtCore.QSize(800, 600))
self.centralwidget.setMaximumSize(QtCore.QSize(1920, 1080))
self.centralwidget.setStyleSheet("background: transparent;\n"
"image: transparent;\n"
)
self.centralwidget.setObjectName("centralwidget")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setEnabled(True)
self.widget.setGeometry(QtCore.QRect(0, 0, 1366, 720))
self.widget.setAutoFillBackground(False)
self.widget.setStyleSheet("image: url(:/Resources/Resources/journal input fg.png);"
f"background-image: url({main.image_path});")
self.widget.setObjectName("widget")
self.scrollArea = QtWidgets.QScrollArea(self.widget)
self.scrollArea.setGeometry(QtCore.QRect(130, 269, 1101, 269))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth())
self.scrollArea.setSizePolicy(sizePolicy)
self.scrollArea.setMinimumSize(QtCore.QSize(0, 0))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(12)
self.scrollArea.setFont(font)
self.scrollArea.setStyleSheet("background: transparent;\n"
"image: transparent;")
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.ScrollAreaWidgetContents = QtWidgets.QWidget()
self.ScrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 1099, 267))
self.ScrollAreaWidgetContents.setObjectName("ScrollAreaWidgetContents")
self.JournalContent = QtWidgets.QPlainTextEdit(self.ScrollAreaWidgetContents)
self.JournalContent.setGeometry(QtCore.QRect(0, 0, 1101, 271))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.JournalContent.sizePolicy().hasHeightForWidth())
self.JournalContent.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(12)
self.JournalContent.setFont(font)
self.JournalContent.setPlaceholderText("")
self.JournalContent.setObjectName("JournalContent")
self.JournalContent.setStyleSheet("\n"
"font: 700 18pt \"Arial\";\n"
"alternate-background-color: rgb(255, 85, 0);\n"
"selection-color: rgb(170, 0, 0);\n"
"selection-background-color: rgb(170, 0, 0);\n"
"border-color: rgb(0, 0, 0);\n")
self.scrollArea.setWidget(self.ScrollAreaWidgetContents)
self.SubmitButton = QtWidgets.QPushButton(self.widget)
self.SubmitButton.setEnabled(True)
self.SubmitButton.setGeometry(QtCore.QRect(1061, 562, 171, 71))
self.SubmitButton.setAutoFillBackground(False)
self.SubmitButton.setStyleSheet("background: transparent;\n"
"image: transparent;")
self.SubmitButton.setText("")
self.SubmitButton.setFlat(True)
self.SubmitButton.setObjectName("SubmitButton")
self.backButton = QtWidgets.QPushButton(self.widget)
self.backButton.setGeometry(QtCore.QRect(30, 30, 81, 81))
self.backButton.setStyleSheet("image:transparent;\n"
"background: transparent;")
self.backButton.setText("")
self.backButton.setObjectName("backButton")
# MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Journal Input"))
import Journal.Journal_rc
import Journal.Journal_rc
import Journal.JournalList_GUI as uw
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout,QSizePolicy
import sys
from PyQt5 import QtWidgets, QtCore
from datetime import date, datetime
from Journal.JournalDatabase import JournalDatabase
from Mood.mood_pyqt_visual_calendar import Mood_Form_Calendar as mfc
class Journal_GUI_Call(QWidget, uw.JournalList, JournalDatabase):
def __init__(self):
super().__init__()
JournalDatabase.__init__(self)
self.setupUi(self)
self.dateChoose.clicked.connect(self.chooseDate)
self.dRight.clicked.connect(self.do_something_right)
self.dLeft.clicked.connect(self.do_something_left)
self.next.clicked.connect(self.backButton)
def chooseDate(self):
self.dateChoice = mfc()
self.dateChoice.show()
self.dateChoice.calendar_mood_visual_ok.clicked.connect(self.do_something_calendar_ok) # taken from mood
self.dateChoice.calendar_mood_visual_cancel.clicked.connect(self.do_somethong_calendar_cancel)
def do_something_calendar_ok(self):
self.dateChoice.close()
self.dateChoose.setText(self.dateChoice.calendar_mood_visual.selectedDate().toString(Qt.ISODate))
self.calculate_journal()
def do_somethong_calendar_cancel(self):
self.dateChoice.close()
def calculate_journal(self):
self.date_choosen = self.dateChoose.text().replace("-","")
self.journal_text = self.findJournal(self.date_choosen)
if (self.journal_text == None):
print("Empty Journal or No Journal on that day")
self.contentView.setText("NoContent")
pass
else:
print(self.journal_text.replace('\\n','\n').replace('\\t','\t'))
self.contentView.setText(self.journal_text.replace('\\n','\n').replace('\\t','\t'))
pass
def do_something_right(self):
selected_date_str = self.dateChoose.text()
selected_date = QtCore.QDate.fromString(selected_date_str, "yyyy-MM-dd")
next_date = selected_date.addDays(-1)
date_string = next_date.toString(Qt.ISODate)
self.dateChoose.setText(date_string)
self.calculate_journal()
def do_something_left(self):
selected_date_str = self.dateChoose.text()
selected_date = QtCore.QDate.fromString(selected_date_str, "yyyy-MM-dd")
previous_date = selected_date.addDays(1)
date_string = previous_date.toString(Qt.ISODate)
self.dateChoose.setText(date_string)
self.calculate_journal()
def backButton(self):
from MainMenu.main_menu_GUI import Main_Menu_GUI
self.main_menu = Main_Menu_GUI()
self.main_menu.show()
self.hide()
# app = QtWidgets.QApplication(sys.argv)
# window = Journal_GUI_Call()
# window.show()
# sys.exit(app.exec_())
\ No newline at end of file
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'qtjournallist.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
import MainMenu.mainmenu as main
class JournalList(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1366, 720)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(800, 600))
MainWindow.setMaximumSize(QtCore.QSize(1920, 1080))
MainWindow.setStyleSheet(f"background-image: url({main.image_path});")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setStyleSheet(f"background-image: url({main.image_path});")
self.centralwidget.setObjectName("centralwidget")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(0, 0, 1366, 720))
self.widget.setStyleSheet("image: url(:/Resources/Resources/journal list fg.png);\n"
"background : transparent")
self.widget.setObjectName("widget")
self.contentFrame = QtWidgets.QFrame(self.widget)
self.contentFrame.setGeometry(QtCore.QRect(132, 270, 1101, 267))
self.contentFrame.setStyleSheet("background: transparent;\n"
"image: transparent;")
self.contentFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.contentFrame.setFrameShadow(QtWidgets.QFrame.Raised)
self.contentFrame.setObjectName("contentFrame")
self.contentView = QtWidgets.QLabel(self.contentFrame)
self.contentView.setGeometry(QtCore.QRect(0, 0, 1101, 267))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(12)
self.contentView.setFont(font)
self.contentView.setText("")
self.contentView.setTextFormat(QtCore.Qt.PlainText)
self.contentView.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.contentView.setWordWrap(True)
self.contentView.setObjectName("contentView")
self.contentView.setStyleSheet("\n"
"font: 700 18pt \"Arial\";\n"
"alternate-background-color: rgb(255, 85, 0);\n"
"selection-color: rgb(170, 0, 0);\n"
"selection-background-color: rgb(170, 0, 0);\n"
"border-color: rgb(0, 0, 0);\n")
self.dRight = QtWidgets.QPushButton(self.widget)
self.dRight.setGeometry(QtCore.QRect(620, 570, 51, 51))
self.dRight.setAutoFillBackground(False)
self.dRight.setStyleSheet("image: transparent;")
self.dRight.setText("")
self.dRight.setObjectName("dRight")
self.dLeft = QtWidgets.QPushButton(self.widget)
self.dLeft.setGeometry(QtCore.QRect(700, 570, 51, 51))
self.dLeft.setAutoFillBackground(False)
self.dLeft.setStyleSheet("image: transparent;")
self.dLeft.setText("")
self.dLeft.setObjectName("dLeft")
self.next = QtWidgets.QPushButton(self.widget)
self.next.setGeometry(QtCore.QRect(1080, 570, 151, 51))
self.next.setAutoFillBackground(False)
self.next.setStyleSheet("image: transparent;")
self.next.setText("")
self.next.setObjectName("next")
self.dateChoose = QtWidgets.QPushButton(self.widget)
self.dateChoose.setGeometry(QtCore.QRect(1090, 210, 148, 41))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.dateChoose.sizePolicy().hasHeightForWidth())
self.dateChoose.setSizePolicy(sizePolicy)
self.dateChoose.setStyleSheet("image: transparent;\n"
"background: transparent;")
self.dateChoose.setText("Choose Date")
self.dateChoose.setObjectName("dateChoose")
# MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "JournalList"))
import Journal.Journal_rc
This source diff could not be displayed because it is too large. You can view the blob instead.
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment