Skip to content

Commit

Permalink
Merge f9b89f5 into 256cf17
Browse files Browse the repository at this point in the history
  • Loading branch information
ak2ls2py committed Dec 15, 2016
2 parents 256cf17 + f9b89f5 commit 844e137
Show file tree
Hide file tree
Showing 29 changed files with 419 additions and 111 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

# C extensions
*.so
# log files
*.log

# Packages
*.egg
Expand Down
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ recursive-exclude junk *
recursive-exclude src *.rpt
recursive-exclude src/rrpam_wds/tests ?.inp
global-exclude log.txt
global-exclude *.log
recursive-exclude service *

global-exclude *.swp
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ coveralls
pytest-cov
docutils
cx_freeze
pyyaml

5 changes: 4 additions & 1 deletion src/rrpam_wds/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@
"""
# from rrpam_wds.gui import set_pyqt_api # isort:skip # NOQA

import logging

from rrpam_wds.cli import Main

if __name__ == "__main__": # pragma: no cover
print("Tweet")
logger = logging.getLogger()
logger.info("Tweet")
Main().show_application()
4 changes: 3 additions & 1 deletion src/rrpam_wds/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from rrpam_wds.gui import set_pyqt_api # isort:skip # NOQA

import argparse
import logging
import sys

from PyQt5.QtCore import QObject
Expand All @@ -34,7 +35,8 @@ class Main(QObject):

def __init__(self, args=None):
args = parser.parse_args(args=args)
print(args.names)
logger = logging.getLogger()
logger.info(args.names)
self.app = QApplication([])
self.win = MainWindow()
self.win.show()
Expand Down
57 changes: 51 additions & 6 deletions src/rrpam_wds/gui/dialogs.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from rrpam_wds.gui import set_pyqt_api # isort:skip # NOQA

import logging
import math
import random
import sys

from guidata.configtools import add_image_module_path
from guidata.configtools import get_icon
from guiqwt.builder import make
from guiqwt.config import CONF
from guiqwt.plot import CurveDialog
Expand All @@ -30,6 +32,7 @@
from PyQt5.QtWidgets import QDialog
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QMdiArea
from PyQt5.QtWidgets import QPlainTextEdit
from PyQt5.QtWidgets import QSizePolicy
from PyQt5.QtWidgets import QVBoxLayout

Expand All @@ -38,6 +41,8 @@
from rrpam_wds.constants import units
from rrpam_wds.gui import monkey_patch_guiqwt_guidata
from rrpam_wds.gui.custom_toolbar_items import ResetZoomTool
from rrpam_wds.logger import EmittingLogger
from rrpam_wds.logger import setup_logging
from rrpam_wds.project_manager import ProjectManager as PM

# there are some changes to the guiqwt classes to be done. It is not easy to do this by subclassing, as
Expand All @@ -52,6 +57,26 @@
STYLE = style_generator()


class LogDialog(QDialog):

def __init__(self):
super(LogDialog, self).__init__()
self.logwindow = QPlainTextEdit()
self.logwindow.setReadOnly(True)
self.logwindow.setStyleSheet("QPlainTextEdit {background-color:gray}")
layout = QVBoxLayout(self)
layout.addWidget(self.logwindow)
self.setWindowIcon(get_icon("log_file.png"))

@pyqtSlot(object)
def reciever(self, object):
print("I Got: ", str(object))
self.logwindow.appendPlainText(object)

def get_text(self):
return self.logwindow.toPlainText()


class CurveDialogWithClosable(CurveDialog):

"""The mother dialog from which all the graph windows inherit from
Expand Down Expand Up @@ -202,6 +227,8 @@ def set_proper_axis_limits(self, data):
self.set_axes_limits(_axes_limits)

def plot_links(self, links):
if (not links):
return
adfs = [x.cons for x in links]
prob = [x.prob for x in links]
# first compute bounding box
Expand Down Expand Up @@ -434,16 +461,30 @@ class emptyclass:
menuitems.open_project = "&Open project"

update_selected_items = True
LOGSTARTMESSAGE = "Logging started"

def __init__(self, parent=None):

super(MainWindow, self).__init__(parent)

setup_logging()
logger = logging.getLogger()
handler = [x for x in logger.handlers if isinstance(x, EmittingLogger)][0]
self.logdialog = LogDialog()
handler.logsender.logsender_signal.connect(self.logdialog.reciever)
logger.info(self.LOGSTARTMESSAGE)

self.optimaltimegraphs = {}
self.mdi = QMdiArea()
self.setCentralWidget(self.mdi)
self.setMenu()
self.standard_windows()
self.connect_project_manager()

def show_logwindow(self):
self.addSubWindow(self.logdialog)
self.logdialog.show()

def connect_project_manager(self):
self.pm = PM()
self._open_project_signal.connect(self.pm.open_project)
Expand All @@ -460,7 +501,8 @@ def selected_holder(self, widget):
self.update_all_plots_with_selection(widget)

def update_all_plots_with_selection(self, widget):
print("selection changed!")
logger = logging.getLogger()
logger.info("selection changed!")
try:
# firt get all subplots
subplots = [x.get_plot() for x in self.optimaltimegraphs.values()]
Expand All @@ -480,7 +522,8 @@ def update_all_plots_with_selection(self, widget):
# don't forget to reset
self.update_selected_items = True
except:
print("non selectable item!")
logger = logging.getLogger()
logger.info("non selectable item!")

def add_optimaltimegraph(self):
wlc = optimalTimeGraph(mainwindow=self)
Expand Down Expand Up @@ -512,7 +555,8 @@ def setMenu(self):
file2.triggered[QAction].connect(self.windowaction)

def windowaction(self, q):
print("triggered")
logger = logging.getLogger()
logger.info("triggered")

if q.text() == self.menuitems.new_wlc:
self.add_optimaltimegraph()
Expand All @@ -534,12 +578,13 @@ def _open_project(self):
def display_project(self, project):
"""Will display the items represented in the project."""

print("I got it!")
logger = logging.getLogger()
logger.info("I got it!")
self._display_project(project)

def _display_project(self, project):
nodes = project.nodes
links = project.links
nodes = getattr(project, "nodes", None)
links = getattr(project, "links", None)
# id_ =project.id
self.networkmap.draw_network(nodes, links)
self.riskmatrix.plot_links(links)
Expand Down
Binary file added src/rrpam_wds/gui/images/log_file.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 4 additions & 1 deletion src/rrpam_wds/gui/monkey_patch_guiqwt_guidata.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
import logging

import numpy as np
from guidata.py3compat import maxsize
from guiqwt.curve import CurveItem
Expand Down Expand Up @@ -33,7 +35,8 @@ def custom__del__(self):
try:
orig___del__(self)
except:
print("Better to fix me later.")
logger = logging.getLogger()
logger.info("Better to fix me later.")

# now monkey patch
CurvePlot.__del__ = custom__del__
Expand Down
8 changes: 6 additions & 2 deletions src/rrpam_wds/hydraulic_services.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import logging
import tempfile

from epanettools.epanettools import EPANetSimulation
from epanettools.epanettools import Link
from epanettools.epanettools import Node

logger = logging.getLogger()

class pdd_service(object):


def __init__(self, epanet_network, diafact=10.0, coords=False, adfcalc=True):
self.epanet_network = epanet_network
Expand Down Expand Up @@ -39,9 +42,10 @@ def read_coordinates(self, epanet_network):
node.x
node.y
except AttributeError as e:
print(

logger.info(
"There is an error in your network file, some nodes do not have coordinates. Fix them and retry please.")
print("Offending item: %s: Node: %s (%d)" % (epanet_network, node.id, i))
logger.info("Offending item: %s: Node: %s (%d)" % (epanet_network, node.id, i))
raise e

for i, link in self.links.items():
Expand Down
46 changes: 46 additions & 0 deletions src/rrpam_wds/log/logging.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
---
version: 1
disable_existing_loggers: True
formatters:
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout

info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: simple
filename: info.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8

error_file_handler:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: simple
filename: error.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8

emitting_logger:
class: rrpam_wds.logger.EmittingLogger
level: INFO
formatter: simple

root:
level: INFO
handlers: [console, info_file_handler, error_file_handler, emitting_logger]

rrpam_wds:
level: INFO
handlers: [console, info_file_handler, error_file_handler, emitting_logger]

...
90 changes: 90 additions & 0 deletions src/rrpam_wds/logger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import logging.config
import os

import yaml
from PyQt5.QtCore import QObject
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication

DEFAULTCONFIG = os.path.join(os.path.dirname(__file__), 'log', 'logging.yml')


class LogSender(QObject):
logsender_signal = pyqtSignal(object)

def __init__(self):
super(LogSender, self).__init__()
if not hasattr(self, 'logsender_signal'):
LogSender.logsender_signal = pyqtSignal(object)


class EmittingLogger(logging.Handler):

def __init__(self):
super(EmittingLogger, self).__init__()
# self.widget = QPlainTextEdit(parent)
# self.widget.setReadOnly(True)
self.logsender = LogSender()
self.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))

def emit(self, record):
msg = self.format(record)
# self.widget.appendPlainText(msg)
self.logsender.logsender_signal.emit(msg)


def setup_logging(default_path=DEFAULTCONFIG, default_level=logging.INFO,
env_key='LOG_CFG'):
"""Setup logging configuration
"""

path = default_path
value = os.getenv(env_key, None)
if value:
path = value
if os.path.exists(path):
with open(path, 'rt') as f:
config = yaml.safe_load(f.read())
logging.config.dictConfig(config)

else:
logging.basicConfig(level=default_level)
# emittinglogger=EmittingLogger()

# logger=logging.getLogger()
# logger.addHandler(emittinglogger)


@pyqtSlot(object)
def reciever(object):
print("I Got: ", str(object))


if __name__ == "__main__":
from rrpam_wds.gui.dialogs import MainWindow

app = QApplication([])

mw = MainWindow()
# setup_logging()

# logger=logging.getLogger()
# win=QPlainTextEdit()
# mw.mdi.addSubWindow(win)
# print(logger.handlers)
# from rrpam_wds.logger import EmittingLogger
# handler=[x for x in logger.handlers if isinstance(x,EmittingLogger)][0]
# handler.logsender.logsender_signal.connect(reciever)
# handler.logsender.logsender_signal.connect(win.appendPlainText)
logger = logging.getLogger()
logger.info("Hello, world!")
logger.info("Hello, world!")
mw.show()
mw.show_logwindow()
mw.show_logwindow()

mw.show_logwindow()

app.exec_()
Loading

0 comments on commit 844e137

Please sign in to comment.