#!/usr/bin/python3
import sys
import os
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QPushButton,QVBoxLayout,QLineEdit,QHBoxLayout,QComboBox,QCheckBox,QTableWidget,\
QHeaderView,QTableWidgetSelectionRange
from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from appconfig.appConfigStack import appConfigStack as confStack
import gettext
_ = gettext.gettext
class QLabelDescription(QWidget):
def __init__(self,label="",description="",parent=None):
super (QLabelDescription,self).__init__(parent)
self.label=QLabel()
self.labelText=label
self.label.setText('{}'.format(label))
self.label.setStyleSheet("border:0px;margin:0px;")
self.description=QLabel()
self.description.setStyleSheet("border:3px solid silver;border-top:0px;border-right:0px;border-left:0px;margin-top:0px;")
self.descriptionText=description
self.description.setText('{}'.format(description))
QBox=QVBoxLayout()
QBox.addWidget(self.label,-1,Qt.AlignBottom)
QBox.addWidget(self.description,Qt.AlignTop)
self.setLayout(QBox)
self.show()
#def __init__
def setText(self,label,description=""):
self.labelText=label
self.label.setText('{}'.format(label))
self.descriptionText=description
self.description.setText('{}'.format(description))
#def setText
def text(self):
return([self.labelText,self.descriptionText])
#def text
#class QLabelDescription
class defaultRepos(confStack):
def __init_stack__(self):
self.dbg=False
self._debug("confDefault Load")
self.menu_description=(_("Choose the default repositories"))
self.description=(_("Default repositories"))
self.icon=('go-home')
self.tooltip=(_("From here you can activate/deactivate the default repositories"))
self.index=1
self.enabled=True
self.defaultRepos={}
self.changed=[]
self.level='user'
#def __init__
def _load_screen(self):
box=QVBoxLayout()
lbl_txt=QLabel(_("Enable or disable default repositories"))
lbl_txt.setAlignment(Qt.AlignTop)
box.addWidget(lbl_txt,0)
self.table=QTableWidget(1,2)
Hheader=self.table.horizontalHeader()
Vheader=self.table.verticalHeader()
Hheader.setSectionResizeMode(0,QHeaderView.Stretch)
Vheader.setSectionResizeMode(QHeaderView.ResizeToContents)
self.table.setShowGrid(False)
self.table.setSelectionBehavior(QTableWidget.SelectRows)
self.table.setSelectionMode(QTableWidget.NoSelection)
self.table.setEditTriggers(QTableWidget.NoEditTriggers)
self.table.horizontalHeader().hide()
self.table.verticalHeader().hide()
box.addWidget(self.table)
self.setLayout(box)
config=self.getConfig()
self.appConfig.n4d.server='localhost'
self.appConfig.n4d.n4dClient=None
self.updateScreen()
#def _load_screen
def updateScreen(self):
self.table.clearContents()
self.changed=[]
while self.table.rowCount():
self.table.removeRow(0)
config=self.getConfig()
try:
n4dclass="RepoManager"
n4dmethod="list_default_repos"
repos=self.n4dQuery(n4dclass,n4dmethod)
if isinstance(repos,str):
#It's a string, something went wrong. Perhaps a llx16 server?
if (repos=="METHOD NOT ALLOWED FOR YOUR GROUPS"):
#Server is a llx16 so switch to localhost
self._debug("LLX16 server detected. Switch to localhost")
self.errServer=True
repos=self.n4dQuery(n4dclass,n4dmethod)
if repos.get('status',0)!=-1:
self.defaultRepos=repos.get('data',{}).copy()
except Exception as e:
self._debug(self.n4dQuery(n4dclass,n4dmethod))
states={}
row=0
for repo,data in self.defaultRepos.items():
self.table.insertRow(row)
state=data.get('enabled','false')
if state=='true':
state=True
else:
state=False
description=data.get('desc','')
lbl=QLabelDescription(repo,_(description))
self.table.setCellWidget(row,0,lbl)
chk=QCheckBox()
chk.setTristate(False)
chk.setStyleSheet("margin-left:50%;margin-right:50%")
chk.stateChanged.connect(lambda x:self.setChanged(chk))
chk.stateChanged.connect(self.changeState)
self.table.setCellWidget(row,1,chk)
chk.setChecked(state)
row+=1
#def _udpate_screen
def changeState(self):
row=self.table.currentRow()
repoWidget=self.table.cellWidget(row,0)
stateWidget=self.table.cellWidget(row,1)
if repoWidget==None:
self._debug("Item not found at %s,%s"%(row,0))
return
repo=repoWidget.text()[0]
#Check mirror
if repo.lower()=="lliurex mirror":
oldServer=self.appConfig.n4d.server
oldClient=self.appConfig.n4d.n4dClient
self.appConfig.n4d.server='server'
self.appConfig.n4d.n4dClient=None
#Mirror must be checked against server
ret=self.appConfig.n4dQuery("MirrorManager","is_mirror_available")
self.appConfig.n4d.server=oldServer
self.appConfig.n4d.n4dClient=oldClient
if (type(ret)==type("")):
if ret!="Mirror available":
self._debug("Mirror not available")
self.showMsg(_("Mirror not available"),'RepoMan')
self.defaultRepos[repo]['enabled']="False"
self.updateScreen()
return
elif not (ret.get('status',False)):
self._debug("Mirror not available")
self.showMsg(_("Mirror not available"),'RepoMan')
self.defaultRepos[repo]['enabled']="False"
self.updateScreen()
return
state=str(stateWidget.isChecked()).lower()
self.defaultRepos[repo]['enabled']="%s"%state
if repo not in self.changed:
self.changed.append(repo)
#def changeState
def writeConfig(self):
ret=True
for repo in self.changed:
self._debug("Updating %s"%repo)
ret=self.n4dQuery("RepoManager","write_repo_json",{repo:self.defaultRepos[repo]})
if ret:
ret=self.n4dQuery("RepoManager","write_repo",{repo:self.defaultRepos[repo]})
if ret==False:
self.showMsg(_("Couldn't write repo")+" {}".format(repo),'error')
else:
self.showMsg(_("Couldn't write info for")+" {}".format(repo),'error')
if ret==True:
self._updateRepos()
self.updateScreen()
#def writeConfig
def _updateRepos(self):
cursor=QtGui.QCursor(Qt.WaitCursor)
self.setCursor(cursor)
self._debug("Updating repos")
ret=self.appConfig.n4dQuery("RepoManager","update_repos")
ret=ret.get('data','')
errList=[]
for line in ret.split("\n"):
if line.startswith("E: ") or line.startswith("W:"):
for name,data in self.defaultRepos.items():
for repoLine in data.get('repos',[]):
repoItems=repoLine.split(" ")
if repoItems:
if repoItems[0] in line:
if "NODATA" in line:
continue
err=" *{}".format(name)
if err not in errList:
errList.append(err)
ret=("\n").join(errList)
if ret:
#self.showMsg(_("Repositories updated succesfully"))
self._debug("Error updating: %s"%ret)
ret=_("Failed to update: ")+"\n"+"{}".format(ret)
self.showMsg("{}".format(ret),'RepoMan')
self.refresh=True
self.changes=False
else:
self.showMsg(_("Repositories updated succesfully"))
cursor=QtGui.QCursor(Qt.PointingHandCursor)
self.setCursor(cursor)
#def _updateRepos