Esempio n. 1
0
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)		    
Esempio n. 2
0
    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)