Subversion Repositories basico

Rev

Rev 126 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

#!/usr/bin/python
# -*- coding: utf-8 -*-
# File: sapnoteviewmenu.py
# Author: Tomás Vírseda
# License: GPL v3
# Description: SAPNoteView GTK.TreeView widgets

from enum import IntEnum
import traceback as tb
from cgi import escape

import gi
gi.require_version('Gdk', '3.0')
gi.require_version('Gtk', '3.0')
from gi.repository import Gdk
from gi.repository import Gio
from gi.repository import Gtk
from gi.repository import Pango
from gi.repository.GdkPixbuf import Pixbuf
from gi.repository import Pango
from datetime import datetime
from dateutil import parser as dateparser

from .sapnoteview import SAPNoteView
from .log import get_logger



class SAPNoteViewMenu(SAPNoteView):
    def prepare(self):
        self.column_rowtype.set_visible(False)
        self.column_checkbox.set_visible(False)
        self.column_icon.set_visible(False)
        self.column_component.set_visible(True)
        self.column_cat.set_visible(False)
        self.column_sntype.set_visible(False)
        self.column_sid.set_visible(False)
        self.column_priority.set_visible(True)
        self.column_lang.set_visible(False)
        self.column_rel.set_visible(False)

        # TreeView common
        self.set_can_focus(True)
        self.set_headers_visible(False)
        self.set_enable_search(True)
        self.set_hover_selection(False)
        self.set_grid_lines(Gtk.TreeViewGridLines.NONE)
        self.set_level_indentation(0)
        #~ self.set_search_entry(self.gui.get_widget('stySearchInfo'))
        #~ self.set_search_column(3)

        # Go live
        # FIXME: right click not working
        #~ self.connect('button_press_event', self.right_click)
        #~ self.connect('row-activated', self.double_click)
        #~ self.connect('cursor-changed', self.row_changed)
        self.sig_selection_changed = self.selection.connect('changed', self.row_changed) #self.selection_changed)


    #~ def selection_changed(self, *args):
        #~ self.log.debug(args)
        #~ return True


    def row_changed(self, selection):
        #~ self.log.debug("Status: %s" % self.current_status)
        if self.current_status is None:
            #~ pass
            selected = set()
            #~ selection = treeview.get_selection()
            model, treeiters = selection.get_selected() #_rows()
            #~ self.log.debug("%s - %s - %s" % (model, selection, treeiters))
            visor = self.gui.get_widget('visor')
            try:
                row = model[treeiters][0]
                row_type, sid = row.split('@')
                self.log.debug("%s (%s)" % (row_type, sid))
                matches = self.db.get_notes_by_node(row_type, sid)
                #~ self.log.debug("Populating visor with %d SAP Notes" % len(matches))
                visor.populate(matches)
            except:
                #~ self.log.error(tb.format_exc())
                #~ pass
                visor.populate([])

            #~ return False


    def right_click(self, treeview, event, data=None):
        self.log.debug("Right click intercepted")
        if event.button == 3:
            x = int(event.x)
            y = int(event.y)
            time = event.time
            pthinfo = self.get_path_at_pos(x,y)
            if pthinfo is not None:
                path,col,cellx,celly = pthinfo
                self.grab_focus()
                self.set_cursor(path,col,0)

                model = treeview.get_model()
                treeiter = model.get_iter(path)
                for n in range(9):
                    self.log.debug("%d -> %s" % (n, model.get_value(treeiter, n)))
                rowtype, value = model.get_value(treeiter, 0).split('@')
                self.log.debug("Row type: %s ->   %s" % (rowtype, value))
                if rowtype == 'task':
                    task = model.get_value(treeiter, 6)
                    self.popup_menu = self.menu.create_popup_menu_by_task(task)
                elif rowtype == 'componentkey':
                    component = model.get_value(treeiter, 3)
                    self.popup_menu = self.menu.create_popup_menu_by_component(component)
                elif rowtype == 'sapnote':
                    sid = model.get_value(treeiter, 6)
                    self.popup_menu = self.menu.create_popup_menu_by_sapnote(sid)
                else:
                    return False

                if self.popup_menu is not None:
                    self.popup_menu.show_all()
                    self.popup_menu.popup(None, None, None, None, event.button, event.time)
                    return True # event has been handled
                else:
                    return False


    def double_click(self, treeview, row, col):
        model = treeview.get_model()
        row = model[row][0]
        row_type, sid = row.split('@')
        self.set_select_notes([sid])
        self.cb.actions_browse()


    def set_view(self, view):
        # FIXME: Get last view visited from config
        # Change icon
        if view is None:
                view ='chronologic'
        self.log.debug ("View: %s - Type (%s)" % (view, type(view)))
        iconview = self.gui.get_widget('imgViewCurrent')
        icon = self.im.get_pixbuf_icon(view, 16, 16)
        iconview.set_from_pixbuf(icon)
        self.view = view
        self.log.debug("Set current view to: %s" % view)

        # Change label
        viewlabel = self.gui.get_widget('lblViewCurrent')
        name = "<b>%-s</b>" % view.capitalize()
        viewlabel.set_markup(name)
        self.populate([])


    def get_view(self):
        return self.view

    def populate(self, sapnotes):
        #~ self.log.debug(self.sig_selection_changed)
        self.current_status = "working"

        self.set_headers_visible(False)
        self.column_sid.set_visible(False)
        self.column_rel.set_visible(False)
        self.column_priority.set_visible(False)
        self.column_icon.set_visible(False)
        self.column_checkbox.set_visible(False)

        tgbshowmenu = self.gui.get_widget('tgbShowMenuView')
        tgbshowmenu.set_active(True)

        self.log.debug("sapnotes: %s" % sapnotes)
        if len(sapnotes) == 0:
            sapnotes = self.db.get_notes()

        if self.view == 'components':
            self.populate_by_components(sapnotes)
        elif self.view == 'description':
            self.populate_by_component_descriptions(sapnotes)
        elif self.view == 'bookmarks':
            self.populate_by_bookmarks()
        elif self.view == 'projects':
            self.populate_by_projects(sapnotes)
        elif self.view == 'tasks':
            self.populate_by_tasks(sapnotes)
        elif self.view == 'tags':
            self.populate_by_tags(sapnotes)
        elif self.view == 'category':
            self.populate_by_category(sapnotes)
        elif self.view == 'chronologic':
            self.populate_by_chronologic(sapnotes)
        elif self.view == 'priority':
            self.populate_by_priority(sapnotes)
        elif self.view == 'type':
            self.populate_by_type(sapnotes)
        else:
            self.populate_by_components(sapnotes)

        self.log.debug("View '%s' populated" % (self.view))
        self.current_status = None


    def populate_by_bookmarks(self):
        matches = []
        sapnotes = self.db.get_notes()
        for sid in sapnotes:
            if sapnotes[sid]['bookmark']:
                matches.append(sid)
        matches.sort()

        visor = self.gui.get_widget('visor')
        tgbshowmenu = self.gui.get_widget('tgbShowMenuView')
        tgbshowmenu.set_active(False)
        visor.populate(matches)



    def populate_by_components(self, sapnotes, only_bookmarks=False):
        self.log.debug('Populating by components')
        self.model.clear()
        self.treepids = {}
        self.column_component.set_title('Components')
        self.column_icon.set_visible(False)
        self.column_component.set_visible(True)
        self.column_component.set_expand(True)
        self.column_title.set_visible(False)
        self.column_sid.set_visible(False)
        self.set_headers_visible(False)

        if len(sapnotes) == 0:
            return

        scomp = set()
        dcomp = {}

        for sid in sapnotes:
            compkey = escape(sapnotes[sid]['componentkey'])
            comptxt = escape(sapnotes[sid]['componenttxt'])
            scomp.add(compkey)
            dcomp[compkey] = comptxt
        lcomp = list(scomp)
        lcomp.sort()

        for compkey in lcomp:
            subkeys = compkey.split('-')
            ppid = None
            for i in range(1, len(subkeys)+1):
                key = ('-').join(subkeys[0:i])
                try:
                    ppid = self.treepids[key]
                except:
                    if i == len(subkeys):
                        title = dcomp[compkey]
                    else:
                        title = ""
                    node = self.get_node_component(key, title)
                    ppid = self.model.append(ppid, node)
                    self.treepids[key] = ppid

        #~ for sid in sapnotes:
            #~ compkey = escape(sapnotes[sid]['componentkey'])
            #~ pid = self.treepids[compkey]


    def populate_by_tasks(self, sapnotes):
        self.model.clear()
        treepids = {}
        icon_notask = self.im.get_icon('notask', 32, 32)
        icon_task = self.im.get_icon('task', 32, 32)
        icon_sapnote = self.im.get_icon('fingerprint', 32, 32)
        icon_bookmark = self.im.get_icon('bookmark', 32, 32)
        self.column_component.set_title('Tasks')
        self.set_headers_visible(False)
        self.column_sid.set_visible(True)
        self.column_icon.set_visible(False)
        self.column_component.set_visible(True)
        self.column_component.set_expand(True)
        self.column_title.set_visible(False)
        self.column_title.set_expand(True)
        self.column_priority.set_expand(False)
        self.column_cat.set_visible(False)
        self.column_sid.set_expand(False)

        if len(sapnotes) == 0:
            return

        #~ "No task assigned" node creation
        node = self.get_node_task('', icon_notask)
        pid = self.model.append(None, node)
        treepids['None'] = pid

        scomp = set()
        dcomp = {}
        taskset = set()
        for sid in sapnotes:
            try:
                # setup components
                compkey = escape(sapnotes[sid]['componentkey'])
                comptxt = escape(sapnotes[sid]['componenttxt'])
                scomp.add(compkey)
                dcomp[compkey] = comptxt

                # setup tasks
                for task in sapnotes[sid]['tasks']:
                    taskset.add(task)
            except: pass

        lcomp = list(scomp)
        lcomp.sort()

        tasklist = []
        tasklist.extend(taskset)
        tasklist.sort()

        for task in tasklist:
            node = self.get_node_task(task, icon_task)
            pid = self.model.append(None, node)
            treepids[task] = pid



    def populate_by_priority(self, sapnotes):
        self.model.clear()
        treepids = {}

        self.set_headers_visible(False)
        self.column_sid.set_visible(False)
        self.column_icon.set_visible(False)
        self.column_component.set_visible(True)
        self.column_component.set_expand(False)
        self.column_title.set_visible(False)
        self.column_title.set_expand(False)
        self.column_priority.set_expand(False)
        self.column_cat.set_visible(False)
        self.column_sid.set_expand(False)

        if len(sapnotes) == 0:
            return

        scomp = set()
        dcomp = {}
        pset = set()

        for sid in sapnotes:
            try:
                priority = sapnotes[sid]['priority']
                pset.add(priority)
            except: pass

        plist = []
        plist.extend(pset)
        plist.sort()

        for priority in plist:
            node = self.get_node_priority(priority)
            pid = self.model.append(None, node)
            treepids[priority] = pid

        #~ for sid in sapnotes:
            #~ priority = sapnotes[sid]['priority']
            #~ pid = treepids[priority]
            #~ sapnote = self.get_node_sapnote(sapnotes[sid], sid)
            #~ self.model.append(pid, sapnote)


    def populate_by_type(self, sapnotes):
        self.model.clear()
        treepids = {}

        self.set_headers_visible(False)
        self.column_sid.set_visible(True)
        self.column_icon.set_visible(False)
        self.column_component.set_visible(True)
        self.column_component.set_expand(False)
        self.column_title.set_visible(True)
        self.column_title.set_expand(True)
        self.column_priority.set_expand(False)
        self.column_cat.set_visible(False)
        self.column_sid.set_expand(False)

        if len(sapnotes) == 0:
            return

        scomp = set()
        dcomp = {}
        pset = set()

        for sid in sapnotes:
            try:
                sntype = sapnotes[sid]['type']
                pset.add(sntype)
            except: pass

        plist = []
        plist.extend(pset)
        plist.sort()

        for sntype in plist:
            node = self.get_node_type(sntype)
            pid = self.model.append(None, node)
            treepids[sntype] = pid

        #~ for sid in sapnotes:
            #~ sntype = sapnotes[sid]['type']
            #~ pid = treepids[sntype]
            #~ sapnote = self.get_node_sapnote_type(sapnotes[sid], sid)
            #~ self.model.append(pid, sapnote)

    def get_node_component(self, compkey, comptxt):
        icon = self.im.get_icon('component', 32, 32)
        node = []
        count = len(self.db.get_notes_by_node("componentkey", compkey))
        component = "%s" % (compkey)

        node.append('componentkey@%s' % compkey)
        node.append(0)
        node.append(icon)
        node.append(component) # Component
        node.append("") # Category
        node.append("") # Type
        node.append("") # %d SAP Notes" % count) # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node


    def get_node_component_desc(self, compkey, comptxt):
        icon = self.im.get_icon('component', 32, 32)
        node = []
        count = len(self.db.get_notes_by_node("componentkey", compkey))
        if len(comptxt) == 0:
            component = "%s" % (compkey)
        else:
            component = "%s" % (comptxt)
        node.append('componentkey@%s' % compkey)
        node.append(0)
        node.append(icon)
        node.append(component) # Component
        node.append("") # Category
        node.append("") # Type
        node.append("") # %d SAP Notes" % count) # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node


    def populate_by_component_descriptions(self, sapnotes, only_bookmarks=False):
        self.log.debug('Populating by components')
        self.model.clear()
        self.treepids = {}
        self.column_component.set_title('Components')
        self.column_icon.set_visible(False)
        self.column_component.set_visible(True)
        self.column_component.set_expand(True)
        self.column_title.set_visible(False)
        self.column_sid.set_visible(False)
        self.set_headers_visible(False)

        if len(sapnotes) == 0:
            return

        scomp = set()
        dcomp = {}

        for sid in sapnotes:
            compkey = escape(sapnotes[sid]['componentkey'])
            comptxt = escape(sapnotes[sid]['componenttxt'])
            scomp.add(compkey)
            dcomp[compkey] = comptxt
        lcomp = list(scomp)
        lcomp.sort()

        for compkey in lcomp:
            subkeys = compkey.split('-')
            ppid = None
            for i in range(1, len(subkeys)+1):
                key = ('-').join(subkeys[0:i])
                try:
                    ppid = self.treepids[key]
                except:
                    if i == len(subkeys):
                        title = dcomp[compkey]
                    else:
                        title = ""
                    node = self.get_node_component_desc(key, title)
                    ppid = self.model.append(ppid, node)
                    self.treepids[key] = ppid


    def populate_by_category(self, sapnotes):
        self.model.clear()
        treepids = {}
        icon_nocat = self.im.get_icon('notask')
        icon_cat = self.im.get_icon('category')
        icon_sapnote = self.im.get_icon('fingerprint')
        icon_bookmark = self.im.get_icon('bookmark')
        self.column_component.set_title('Categories')
        self.set_headers_visible(False)
        self.column_sid.set_visible(True)
        self.column_icon.set_visible(False)
        self.column_component.set_visible(True)
        self.column_component.set_expand(True)
        self.column_title.set_visible(False)
        self.column_title.set_expand(True)
        self.column_priority.set_expand(False)
        self.column_cat.set_visible(False)
        self.column_sid.set_expand(False)

        if len(sapnotes) == 0:
            return

        scomp = set()
        dcomp = {}
        catset = set()

        for sid in sapnotes:
            try:
                cat = sapnotes[sid]['category']
                catset.add(cat)
            except: pass

        catlist = []
        catlist.extend(catset)
        catlist.sort()

        for cat in catlist:
            node = self.get_node_category_view(cat)
            pid = self.model.append(None, node)
            treepids[cat] = pid

        #~ for sid in sapnotes:
            #~ category = sapnotes[sid]['category']
            #~ pid = treepids[category]
            #~ sapnote = self.get_node_sapnote_category(sapnotes[sid], sid)
            #~ self.model.append(pid, sapnote)


    def populate_by_chronologic(self, sapnotes):
        self.model.clear()
        treepids = {}

        self.column_component.set_title('Download date')
        self.set_headers_visible(False)
        self.column_sid.set_visible(True)
        self.column_icon.set_visible(False)
        self.column_component.set_visible(True)
        self.column_component.set_expand(True)
        self.column_title.set_visible(False)
        self.column_title.set_expand(True)
        self.column_priority.set_expand(False)
        self.column_cat.set_visible(False)
        self.column_sid.set_expand(False)

        if len(sapnotes) == 0:
            return

        years = set()
        months = set()
        days = set()
        for sid in sapnotes:
            try:
                downloaded = dateparser.parse(sapnotes[sid]['feedupdate'])
                year = "%d" % downloaded.year
                month = "%02d" % downloaded.month
                day = "%02d" % downloaded.day
                key_year    = year
                key_month   = year + month
                key_day     = year + month + day
                years.add(key_year)
                months.add(key_month)
                days.add(key_day)
            except:
                pass
        years = list(years)
        years.sort(reverse=True)
        months = list(months)
        months.sort(reverse=True)
        days = list(days)
        days.sort(reverse=True)

        for key_year in years:
            try:
                treepids[key_year]
            except:
                adate = key_year + '0101'
                downloaded = dateparser.parse(adate)
                node = self.get_node_date_year(downloaded, key_year)
                treepids[key_year] = self.model.append(None, node)

        for key_month in months:
            try:
                treepids[key_month]
            except:
                adate = key_month + '01'
                downloaded = dateparser.parse(adate)
                node = self.get_node_date_month(downloaded, key_month)
                key_year = key_month[0:4]
                treepids[key_month] = self.model.append(treepids[key_year], node)

        for key_day in days:
            try:
                treepids[key_day]
            except:
                downloaded = dateparser.parse(key_day)
                key_month = key_day[0:6]
                node = self.get_node_date_day(downloaded, key_day)
                treepids[key_day] = self.model.append(treepids[key_month], node)

        #~ for sid in sapnotes:
            #~ downloaded = dateparser.parse(sapnotes[sid]['feedupdate'])
            #~ year = "%d" % downloaded.year
            #~ month = "%02d" % downloaded.month
            #~ day = "%02d" % downloaded.day
            #~ key_year    = year
            #~ key_month   = year + month
            #~ key_day     = year + month + day
            #~ node = self.get_node_sapnote_chronologic(sapnotes[sid], sid)
            #~ self.log.debug("KeyDay %s for SAP Note %s" % (treepids[key_day], sid))
            #~ self.model.append(treepids[key_day], node)

    def get_node_category(self, sapnote):
        compkey = escape(sapnote['componentkey'])
        catname = escape(sapnote['category'])
        catkey = compkey + '-' + catname
        icon = self.im.get_icon('category', 32, 32)

        if len(catname) == 0:
            #~ catname = "<span size='12000'><b>No category assigned</b></span>"
            catname = "No category assigned"
        else:
            #~ category = "<span size='15000'><b>%s</b></span>" % catname
            category = "%s" % catname

        node = []
        node.append('category@%s' % catname)
        node.append(0)
        node.append(icon)
        node.append(category) # Component
        node.append("") # Category
        node.append("") # Type
        node.append("") # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node


    def get_node_date_year(self, date, token_date):
        title = "%s" % token_date

        node = []
        node.append('date-year@%s' % token_date)
        node.append(0)
        node.append(None)
        node.append(title) # Component
        node.append("") # Category
        node.append("") # Type
        node.append("") # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node


    def get_node_date_month(self, date, token_date):
        title = "%s" % date.strftime("%B")

        node = []
        node.append('date-month@%s' % token_date)
        node.append(0)
        node.append(None)
        node.append(title) # Component
        node.append("") # Category
        node.append("") # Type
        node.append("") # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node


    def get_node_date_day(self, date, token_date):
        title = "%s" % date.strftime("%d - %A")

        node = []
        node.append('date-day@%s' % token_date)
        node.append(0)
        node.append(None)
        node.append(title) # Component
        node.append("") # Category
        node.append("") # Type
        node.append("") # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node


    def get_node_priority(self, priority):
        icon = None # self.im.get_icon('category', 32, 32)

        if len(priority) == 0:
            title = "No priority assigned"
        else:
            title = "%s" % priority

        node = []
        node.append('priority@%s' % priority)
        node.append(0)
        node.append(icon)
        node.append(title) # Component # Category title
        node.append("") # Category
        node.append("") # Type
        node.append("") # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node


    def get_node_task(self, task, icon):
        if task == '':
            title = "No task assigned"
        else:
            title = "%s" % task

        node = []
        node.append('task@%s' % task)
        node.append(0)
        node.append(icon)
        node.append(title) # Component
        node.append("") # Category
        node.append("") # Type
        node.append("") # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        node.append("") # Release on
        return node


    def get_node_type(self, sntype):
        icon = self.im.get_icon('type', 32, 32)

        if len(sntype) == 0:
            title = "SAP Note type not found"
        else:
            title = "%s" % sntype

        node = []
        node.append('type@%s' % sntype)
        node.append(0)
        node.append(icon)
        node.append(title) # Component # Category title
        node.append("") # Category
        node.append("") # Type
        node.append("") # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node


    def get_node_category_view(self, category=''):
        icon = None # self.im.get_icon('category', 32, 32)

        if len(category) == 0:
            catname = "No category assigned"
        else:
            catname = "%s" % category

        node = []
        node.append('category@%s' % category)
        node.append(0)
        node.append(icon)
        node.append(catname) # Component # Category title
        node.append("") # Category
        node.append("") # Type
        node.append("") # Id
        node.append("") # Title
        node.append("") # Priority
        node.append("") # Lang
        #~ node.append("") # Version
        node.append("") # Release on
        return node

    def get_node_sapnote_category(self, sapnote, sid):
        compkey = escape(sapnote['componentkey'])
        compkey = escape(sapnote['componentkey'])
        catname = escape(sapnote['category'])
        priority = "%s" % escape(sapnote['priority'])
        released = dateparser.parse(sapnote['releaseon'])
        released = released.strftime("%Y.%m.%d")
        sid = "0"*(10 - len(sid)) + sid
        title = "<big>%s</big>" % (escape(sapnote['title']))
        bookmarked = sapnote['bookmark']

        if bookmarked:
            icon = self.im.get_icon('bookmark', 32, 32)
        else:
            icon = self.im.get_icon('fingerprint', 32, 32)

        # Create row-node
        node = []
        node.append('sapnote@%s' % sid)     # 0. # RowType
        node.append(0)                      # 1. # CheckBox
        node.append(icon)                   # 2. # Icon
        #~ node.append(title)                  # 3. # Component
        node.append(compkey)                  # 3. # Component
        self.log.debug("CompKey: %s" % compkey)
        node.append("")                     # 4. # Category
        node.append(sapnote['type'])        # 5. # Type
        node.append("<b>%s</b>" %sid)       # 6. # Sap Note ID
        node.append("")                     # 7. # Title
        node.append(priority)               # 8. # Priority
        node.append(sapnote['language'])    # 9. # Lang
        node.append(released)               # 10. # Release date

        return node


    def get_node_sapnote_type(self, sapnote, sid):
        #~ compkey = escape(sapnote['componentkey'])
        #~ compkey = escape(sapnote['componentkey'])
        #~ catname = escape(sapnote['category'])
        sntype = "%s" % escape(sapnote['type'])
        #~ released = dateparser.parse(sapnote['releaseon'])
        #~ released = released.strftime("%Y.%m.%d")
        sid = "0"*(10 - len(sid)) + sid
        title = "%s" % (escape(sapnote['title']))
        bookmarked = sapnote['bookmark']

        if bookmarked:
            icon = self.im.get_icon('bookmark', 32, 32)
        else:
            icon = self.im.get_icon('fingerprint', 32, 32)

        # Create row-node
        node = []
        node.append('sapnote@%s' % sid)     # 0. # RowType
        node.append(0)                      # 1. # CheckBox
        node.append(icon)                   # 2. # Icon
        node.append(title)                  # 3. # Component
        node.append("")                     # 4. # Category
        node.append(sapnote['type'])        # 5. # Type
        node.append("%s" %sid)       # 6. # Sap Note ID
        node.append("")                     # 7. # Title
        node.append("")                     # 8. # Priority
        node.append(sapnote['language'])    # 9. # Lang
        node.append("")                     # 10. # Release date

        return node