class Gdocs(plasmascript.Applet): def __init__(self,parent,args=None): plasmascript.Applet.__init__(self,parent) def init(self): self.token = "" self.backUri = [] self.currentUri = None self.gDocs = gDocs() self.setHasConfigurationInterface(True) self.resize(300, 900) self.setAspectRatioMode(Plasma.IgnoreAspectRatio) self.item = None self.row = None self.comboIndex = None self.theme = Plasma.Svg(self) self.theme.setImagePath("widgets/background") self.setBackgroundHints(Plasma.Applet.DefaultBackground) self.label = QLabel() self.label.setText("You can not modify ACL") self.label.setVisible(False) self.textField = QLineEdit() self.textField.setVisible(True) self.textField.setToolTip("Write None for public on the web") self.combo = QComboBox() self.combo.setVisible(True) self.combo.addItem('') self.combo.addItem('Can edit') self.combo.addItem('Can read') self.combo.activated.connect(self.getCombo) self.button = QPushButton() self.button.setText("Back") self.button.clicked.connect(self.back) self.button.setVisible(False) self.save = QPushButton() self.save.setText("Add") self.save.setVisible(True) self.save.clicked.connect(self.addAcl) self.modify = QPushButton() self.modify.setText("Modify") self.modify.setVisible(False) self.modify.clicked.connect(self.modifyAcl) self.delete = QPushButton() self.delete.setText("Delete") self.delete.setVisible(False) self.delete.clicked.connect(self.deleteAcl) self.resourceList = QTreeWidget() self.resourceList.setColumnCount(1) self.resourceList.header().setResizeMode(0, QHeaderView.ResizeToContents) p = QPalette(); p.setColor(QPalette.Base,QColor(255,255,255,128)) p.setColor(QPalette.Text,QColor(0,0,0,255)) self.resourceList.setPalette(p) self.resourceList.header().hide() self.resourceList.setIconSize(QSize(32, 32)) self.resourceList.setRootIsDecorated(False) self.resourceList.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.resourceList.setVerticalScrollMode(QAbstractItemView.ScrollPerItem) self.resourceList.itemDoubleClicked.connect(self.doubleClicked) self.resourceList.itemClicked.connect(self.oneClicked) #self.resourceList.itemActivated.connect(self.back) self.mainLayout = QGridLayout() self.mainLayout.setMargin(0) self.aclList = QTreeWidget() self.aclList.setColumnCount(2) self.aclList.header().setResizeMode(0,QHeaderView.ResizeToContents) p = QPalette(); p.setColor(QPalette.Base,QColor(255,255,255,128)) p.setColor(QPalette.Text,QColor(0,0,0,255)) self.aclList.setPalette(p) self.aclList.header().hide() self.aclList.setIconSize(QSize(32, 32)) self.aclList.setRootIsDecorated(False) self.aclList.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.aclList.setVerticalScrollMode(QAbstractItemView.ScrollPerItem) self.aclList.itemClicked.connect(self.update) self.mainLayout.addWidget(self.button) self.mainLayout.addWidget(self.resourceList) self.mainLayout.addWidget(self.aclList) self.mainLayout.addWidget(self.label) self.mainLayout.addWidget(self.textField) self.mainLayout.addWidget(self.combo) self.mainLayout.addWidget(self.modify) self.mainLayout.addWidget(self.save) self.mainLayout.addWidget(self.delete) groupBox = Plasma.GroupBox() groupBox.nativeWidget().setFlat(True) groupBox.nativeWidget().setLayout(self.mainLayout) self.layout = QGraphicsLinearLayout(self.applet) self.layout.setOrientation(Qt.Vertical) self.layout.addItem(groupBox) def createConfigurationInterface(self,parent): self.config = DocsConfig(self) parent.addPage(self.config,"Connect") self.connect(parent,SIGNAL("okClicked()"), self.configAccepted) self.connect(parent, SIGNAL("cancelClicked()"), self.configDenied) def configDenied(self): pass def configAccepted(self): if unicode(self.config.getUsrname()) == "" or unicode(self.config.getPasswrd()) == "": qmb = QMessageBox() qmb.setText("Fill fields!!!") qmb.exec_() else: self.gDocs.setUsername(self.config.getUsrname()) self.gDocs.setPassword(self.config.getPasswrd()) self.token = self.gDocs.createConnection() self.resourceList.clear() item = self.getResources(self.token) self.resourceList.insertTopLevelItems(0,item) def getResources(self,token,mUri = None): token = gdata.gauth.ClientLoginToken(token) client = gdata.docs.client.DocsClient(auth_token = token) query = gdata.docs.client.DocsQuery(show_collections='true') if mUri is None: feed = client.GetResources(q=query) else: folder = client.GetResourceById(resource_id = mUri,q = query) feed = client.GetResources(uri = folder.content.src,q = query) item = [] for entry in feed.entry: acl = client.GetAcl(entry=entry) for aclEntry in acl.entry: if aclEntry.role.value == 'owner': owner = aclEntry.scope.value resource = ResourceItem(entry.title.text,entry.id.text[entry.id.text.find('%'):len(entry.id.text)],entry.GetResourceType(),entry.IsPrivate(),owner) item.append(resource) return item def doubleClicked(self,item): if item.resource_type == "folder": self.button.setVisible(True) if self.currentUri is not None: self.backUri.append(self.currentUri) self.currentUri = item.id item = self.getResources(self.token,item.id) self.resourceList.clear() self.resourceList.insertTopLevelItems(0,item) else: pass def oneClicked(self,item): self.item = item item = self.getAclList(self.token,item.getId()) self.aclList.clear() self.aclList.insertTopLevelItems(0,item) if str(self.item.getOwner()) != str(self.gDocs.getUsername()): self.label.setVisible(True) self.save.setVisible(False) self.combo.setVisible(False) self.textField.setVisible(False) self.delete.setVisible(False) self.modify.setVisible(False) else: if self.label.isVisible: self.label.setVisible(False) self.save.setVisible(True) self.combo.setVisible(True) self.textField.setVisible(True) self.delete.setVisible(False) self.modify.setVisible(False) def back(self): self.resourceList.clear() if len(self.backUri) > 0: item = self.getResources(self.token,self.backUri[len(self.backUri)-1]) self.backUri.pop() else: item = self.getResources(self.token) self.button.setVisible(False) self.resourceList.insertTopLevelItems(0,item) self.aclList.clear() def getAclList(self,token,mUri): token = gdata.gauth.ClientLoginToken(token) client = gdata.docs.client.DocsClient(auth_token = token) query = gdata.docs.client.DocsQuery(show_collections='true') entry = client.GetResourceById(resource_id=mUri,q=query) aclFeed = client.GetAcl(entry = entry) item = [] owner = True modify = True for aclEntry in aclFeed.entry: if aclEntry.role.value == "owner": if str(self.gDocs.getUsername()).find(str(aclEntry.scope.value)) is -1: modify = False owner = False if owner: modify = True if aclEntry.role.value == 'owner': if str(self.gDocs.getUsername()).find(str(aclEntry.scope.value)) is not -1: modify = False acl = AclItem(mUri,aclEntry.scope.value,aclEntry.role.value,aclEntry.scope.type,modify) item.append(acl) return item def update(self,item,row): if item.getModify() is False: self.label.setVisible(True) self.save.setVisible(False) self.textField.setVisible(False) self.delete.setVisible(False) self.combo.setVisible(False) self.modify.setVisible(False) else: if self.label.isVisible: self.label.setVisible(False) self.modify.setVisible(True) self.combo.setVisible(True) self.save.setVisible(False) self.textField.setVisible(False) self.delete.setVisible(True) self.item = item self.row = row if item.getRights() == 'reader': self.combo.setCurrentIndex(1) elif item.getRights() == 'writer': self.combo.setCurrentIndex(0) def deleteAcl(self): token = gdata.gauth.ClientLoginToken(self.token) client = gdata.docs.client.DocsClient(auth_token = token) query = gdata.docs.client.DocsQuery(show_collections='true') entry = client.GetResourceById(resource_id = self.item.getId()) aclEntry = client.GetAcl(entry = entry) for entry in aclEntry.entry: if str(self.item.getEmail()).find(str(entry.scope.value)) is not -1: aclEntry = entry break client.DeleteAclEntry(aclEntry) self.aclList.removeItemWidget(self.item,self.row) self.aclList.repaint() self.item = None self.row = None def modifyAcl(self): token = gdata.gauth.ClientLoginToken(self.token) client = gdata.docs.client.DocsClient(auth_token = token) query = gdata.docs.client.DocsQuery(show_collections='true') entry = client.GetResourceById(resource_id = self.item.getId()) aclEntry = client.GetAcl(entry = entry) for acl in aclEntry.entry: if str(self.item.email).find(str(acl.scope.value)) is not -1: aclEntry = acl break if self.combo.itemText(self.comboIndex) == 'Can edit': aclEntry.role.value = 'writer' elif self.combo.itemText(self.comboIndex) == 'Can read': aclEntry.role.value = 'reader' aclEntry.etag = None entry = client.UpdateAclEntry(entry=aclEntry) def getCombo(self,num): self.comboIndex = num def addAcl(self): token = gdata.gauth.ClientLoginToken(self.token) client = gdata.docs.client.DocsClient(auth_token = token) query = gdata.docs.client.DocsQuery(show_collections='true') entry = client.GetResourceById(resource_id = self.item.getId()) if self.textField.text() is not None: text = self.textField.text() text = text.split(',') self.textField.clear() if self.combo.itemText(self.comboIndex) == 'Can edit': role = 'writer' elif self.combo.itemText(self.comboIndex) == 'Can read': role = 'reader' for email in text: if (email.indexOf('@') is not -1 and email.indexOf('@') + 1 < len(email)): scopeV = str(email) scopeT = 'user' acl_entry = gdata.docs.data.AclEntry( scope=gdata.acl.data.AclScope(value=scopeV, type=scopeT), role=gdata.acl.data.AclRole(value=role), ) client.AddAclEntry(entry, acl_entry) if (email == 'None' or email == 'none'): scopeV = None scopeT = 'default' acl_entry = gdata.docs.data.AclEntry( scope=gdata.acl.data.AclScope(value=scopeV, type=scopeT), role=gdata.acl.data.AclRole(value=role), ) client.AddAclEntry(entry, acl_entry)
def createConfigurationInterface(self,parent): self.config = DocsConfig(self) parent.addPage(self.config,"Connect") self.connect(parent,SIGNAL("okClicked()"), self.configAccepted) self.connect(parent, SIGNAL("cancelClicked()"), self.configDenied)