示例#1
0
文件: app.py 项目: robol/lum
    def delete_group(self, menu_item = None):
        """Delete the group selected in the group_treeview"""
        if not self.__check_connection():
            return None

        group, t_iter = self.__get_selected_group()

        # If nothing is selected we can return and do nothing.
        # We should only notify the user that what he would like
        # to do can not be done now.
        if t_iter is None:
            show_info_dialog(_("Select a group before asking for its deletion."))
            return

        # Users tend to delete many things they do not want to delete
        if len(self.__connection.get_members(group)) == 0:
            question = _("Really delete group <b>%s</b>?") % group
        else:
            question = _("Really delete the non empty group <b>%s</b>?" +
                         " This will lead to integrity problems.") % group
        if not ask_question(question):
            return

        # Finally we delete the group
        try:
            self.__connection.delete_group(group)
        except LumInsufficientPermissionsError:
            show_error_dialog(_("Insufficient permissions to delete group"))
            return None

        # and delete the group from the treeview
        self.__group_store.remove(t_iter)

        # Finally show the successful operation in the statusbar
        self.statusbar_update(_("Group %s successfully deleted.") % group)
示例#2
0
文件: app.py 项目: robol/lum
    def group_properties(self, menu_item = None):
        """View selected group properties, such as members and
        gidNumber"""

        if not self.__check_connection():
            return None

        group, t_iter = self.__get_selected_group()
        if t_iter is None:
            show_info_dialog(_("Select a group to view its properties"))

        # Get group_members, that are the only interesting property
        # we can get from ldap
        group_members = self.__connection.get_members(group)

        # Get gid
        gid = self.__group_store.get_gid(t_iter)

        # Show info dialog
        dialog_text =  _("<b>Name:</b> %s\n") % group
        dialog_text += "<b>Gid</b>: %s\n" % gid
        if len(group_members) > 0:
            dialog_text += _("<b>Members</b>: ")
            dialog_text += ", ".join(group_members)
        else:
            dialog_text += _("This group is empty.")

        # Show info dialog.
        show_info_dialog(dialog_text)
示例#3
0
文件: app.py 项目: robol/lum
    def create_new_user_dialog(self, menu_item):
        """Create new user"""
        if not self.__check_connection():
            return None

        new_user_dialog = lumNewUserDialog(self.__datapath, self.__connection)
       
        try:
            new_user_dialog.run()
        except LumInsufficientPermissionsError:
            show_error_dialog(_("Insufficient permissions to accomplish operation"))
            return None
        
        if new_user_dialog.usermodel is not None:
            if self.__check_connection():
                new_user_dialog.usermodel.set_dn("uid=%s,%s" % (new_user_dialog.usermodel.get_username(),
                                                                self.__users_ou))

                try:
                    self.__connection.add_user(new_user_dialog.usermodel)
                except LumAlreadyExistsError:
                    show_error_dialog(_("User <b>%s</b> already exists in the ldap tree, " + 
                                        "cannot create one more") % new_user_dialog.usermodel.get_username())
                    return None
                except LumInsufficientPermissionsError:
                    show_error_dialog(_("Insufficient permissions to create the user"))
                    return None
                self.statusbar_update(_("User %s created correctly.") % new_user_dialog.usermodel.get_username())

                # Reload user list because the dialog may have created a new group
                # and then pushing the user will not update the group list too
                self.reload_user_list()
示例#4
0
def menu():
    """First menu shown when add-on menu is requested"""
    if checkSettings() == False:
        return

    options = (_(201), watchlist_menu), (_(202), recommendation_menu), (_(203), trending_menu), (_(204), sync_clean_menu)
    _generate_menu(_(200), options)
示例#5
0
文件: app.py 项目: robol/lum
    def edit_user(self, menu_item = None):
        """Edit selected user"""
        usermodel, t_iter = self.__get_selected_user()
        if t_iter is None: 
            show_info_dialog(_("Select a user to modify"))
            return

        # Create the dialog making a copy of the old usermodel
        # so we can check the difference after modification
        old_user = UserModel(usermodel)

        dialog = lumEditUserDialog(self.__datapath, usermodel, self.__group_store)
        
        new_usermodel = dialog.run()
        if (new_usermodel is not None):

            try:
                self.__connection.modify_user(old_user, new_usermodel)
            except LumInsufficientPermissionsError:
                show_error_dialog(_("Insufficient permissions to edit user"))
                return None

            self.statusbar_update(_("User %s successfully modified") % new_usermodel.get_username())
            
            # TODO: Reload only selected user
            self.reload_user_list()
示例#6
0
def main():
    if ADDON.getSetting('EraseCache') == 'true':
        try:
            urlcache.URLCache(ADDON_DATA_PATH).erase()
        finally:
            ADDON.setSetting('EraseCache', 'false')#@UndefinedVariable

    if not API_KEY:
        raise Exception(_("No API Key."), _("Enter your Met Office API Key under settings."))

    properties.observation()
    properties.daily()
    properties.threehourly()

    WINDOW.setProperty('WeatherProvider', ADDON.getAddonInfo('name'))#@UndefinedVariable
    WINDOW.setProperty('WeatherProviderLogo', ADDON_BANNER_PATH)#@UndefinedVariable
    WINDOW.setProperty('ObservationLocation', ADDON.getSetting('ObservationLocation'))#@UndefinedVariable
    WINDOW.setProperty('Current.Location', ADDON.getSetting('ForecastLocation'))#@UndefinedVariable
    WINDOW.setProperty('ForecastLocation', ADDON.getSetting('ForecastLocation'))#@UndefinedVariable
    WINDOW.setProperty('RegionalLocation', ADDON.getSetting('RegionalLocation'))#@UndefinedVariable
    WINDOW.setProperty('Location1', ADDON.getSetting('ForecastLocation'))#@UndefinedVariable
    WINDOW.setProperty('Locations', '1')#@UndefinedVariable

    #Explicitly set unused flags to false, so there are no unusual side
    #effects/residual data when moving from another weather provider.
    WINDOW.setProperty('36Hour.IsFetched', '')#@UndefinedVariable
    WINDOW.setProperty('Weekend.IsFetched', '')#@UndefinedVariable
    WINDOW.setProperty('Map.IsFetched', '')#@UndefinedVariable
    WINDOW.setProperty('Today.Sunrise', '')#@UndefinedVariable
    WINDOW.setProperty('Today.Sunset', '')#@UndefinedVariable
    WINDOW.setProperty('Weather.CurrentView', '')#@UndefinedVariable
示例#7
0
文件: app.py 项目: robol/lum
    def connect(self, menu_item = None):
        """Connect to server"""
        
        # Determine which server to connect to
        connect_dialog = lumConnectDialog(self.__datapath, self.__configuration)
        uri, bind_dn, base_dn, users_ou, groups_ou = connect_dialog.run()
        
        # Update internal information
        self.__uri = uri 
        self.__bind_dn = bind_dn
        self.__base_dn = base_dn
        self.__users_ou = users_ou
        self.__groups_ou = groups_ou

        if uri is None:
            return
        
        # Add base_dn if necessary
        if not self.__bind_dn.endswith(self.__base_dn): self.__bind_dn += ",%s" % self.__base_dn
        if not self.__users_ou.endswith(self.__base_dn): self.__users_ou += ",%s" % self.__base_dn
        if not self.__groups_ou.endswith(self.__base_dn): self.__groups_ou += ",%s" % self.__base_dn
        
        # Get password from keyring
        password = self.ask_password()
        
        # Notify user of connection
        self.statusbar_update(_("Connecting to %s.") % uri)

        self.__connection =  Connection(uri = self.__uri, bind_dn = self.__bind_dn, 
                                        password = password, 
                                        base_dn = self.__base_dn, users_ou = self.__users_ou, 
                                        groups_ou = self.__groups_ou)

        self.__connection.connect("missing-ou", self.missing_ou_cb)
        self.__connection.connect("connection-completed", self.connection_completed_cb)
        
        # Try to connect to the specified server
        try:
            self.__connection.start()

        except LumError:
            
            # If we can't, maybe password is wrong, so ask it again
            self.forget_password()
            password = self.ask_password()
            
            # and retry the connection. But if we fail even this time, then
            # abort
            try:
                self.__connection.set_password(password)
                self.__connection.start()
            except:
            
                # You had two opportunities, and both are gone. 
                show_error_dialog(
                    _("Error while connecting to the server, check your credentials and your connectivity"))
                
                self.__connection = None
                
                self.statusbar_update(_("Connection failed."))
示例#8
0
def clean_movies(daemon=False):
    """Cleans trakt.tv movie database.

    Checks if trakt contains any movies that the xbmc database doesn't and if any
    are found unlibraries them on trakt.
    """
    if not daemon:
        progress = xbmcgui.DialogProgress()
        progress.create(_(200), _(171))

    trakt_movies = utilities.traktMovieListByImdbID(utilities.getMoviesFromTrakt())
    xbmc_movies = utilities.xbmcMovieListByImdbID(utilities.getMoviesFromXBMC())

    clean_list = []
    index = 0
    length = len(trakt_movies)

    for imdbid in trakt_movies:
        if not daemon:
            index += 1
            progress.update(int(float(index)/length*100), _(171))

        if imdbid not in xbmc_movies:
            clean_list.append({'imdb_id': imdbid, 'title': trakt_movies[imdbid]['title'], 'year': trakt_movies[imdbid]['year']})

    if len(clean_list) > 0:
        utilities.traktJsonRequest('POST', '/movie/unlibrary/%%API_KEY%%', {'movies': clean_list})

    if not daemon:
        progress.close()
def main():
    if ADDON.getSetting('EraseCache') == 'true':
        try:
            urlcache.URLCache(ADDON_DATA_PATH).erase()
        finally:
            ADDON.setSetting('EraseCache', 'false')#@UndefinedVariable

    if not API_KEY:
        raise Exception(_("No API Key."), _("Enter your Met Office API Key under settings."))

    if len(sys.argv) > 1 and sys.argv[1].isdigit():
        properties.observation()
    if not CURRENT_VIEW:
        properties.daily()
    elif CURRENT_VIEW == '3hourly':
        properties.threehourly()
    elif CURRENT_VIEW == 'forecastmap':
        properties.forecastlayer()
    elif CURRENT_VIEW == 'observationmap':
        properties.observationlayer()
    elif CURRENT_VIEW == 'text':
        properties.text()

    WINDOW.setProperty('WeatherProvider', ADDON.getAddonInfo('name'))#@UndefinedVariable
    WINDOW.setProperty('ObservationLocation', ADDON.getSetting('ObservationLocation'))#@UndefinedVariable
    WINDOW.setProperty('ForecastLocation', ADDON.getSetting('ForecastLocation'))#@UndefinedVariable
    WINDOW.setProperty('RegionalLocation', ADDON.getSetting('RegionalLocation'))#@UndefinedVariable
    WINDOW.setProperty('Location1', ADDON.getSetting('ObservationLocation'))#@UndefinedVariable
    WINDOW.setProperty('Locations', '1')#@UndefinedVariable
示例#10
0
def main(location):
    if not API_KEY:
        raise Exception(_("No API Key."),
                        _("Enter your Met Office API Key under settings."))

    KEYBOARD.doModal()  #@UndefinedVariable
    text = KEYBOARD.isConfirmed() and KEYBOARD.getText()  #@UndefinedVariable
    sitelist = getsitelist(location, text)
    if sitelist == []:
        DIALOG.ok(_("No Matches"),
                  _("No locations found containing") +
                  " {0}".format(text))  #@UndefinedVariable
        utilities.log("No locations found containing '%s'" % text)
    else:
        display_list = [site['display'] for site in sitelist]
        selected = DIALOG.select(_("Matching Sites"),
                                 display_list)  #@UndefinedVariable
        if selected != -1:
            ADDON.setSetting(location,
                             sitelist[selected]['name'])  #@UndefinedVariable
            ADDON.setSetting("%sID" % location,
                             sitelist[selected]['id'])  #@UndefinedVariable
            ADDON.setSetting(
                "%sLatitude" % location,
                str(sitelist[selected].get('latitude')))  #@UndefinedVariable
            ADDON.setSetting(
                "%sLongitude" % location,
                str(sitelist[selected].get('longitude')))  #@UndefinedVariable
            utilities.log(
                "Setting '{location}' to '{name} ({distance})'".format(
                    location=location,
                    name=sitelist[selected]['name'].encode('utf-8'),
                    distance=sitelist[selected]['id']))
示例#11
0
    def __init__(self, datapath, configuration):
    
        self.__configuration = configuration
        
        self.__builder = create_builder("LumConnectDialog.ui")
        self.__dialog = self.__builder.get_object("connect_dialog")
        
        for renderer in ('uri_cellrenderer', 'bind_dn_cellrenderer', 'base_dn_cellrenderer',
                         'users_ou_cellrenderer', 'groups_ou_cellrenderer'):
            self.__builder.get_object(renderer).set_property("editable", True)
        
        
        signals = {
            'on_connect_button_activate':        self.on_connect_button_cb,
            'on_add_button_activate':            self.on_add_button_cb,
            'on_uri_cellrenderer_edited':        self.on_uri_edited,
            'on_bind_dn_edited':    self.on_bind_dn_edited,
            'on_base_dn_edited':    self.on_base_dn_edited,
            'on_users_ou_edited':     self.on_users_ou_edited,
            'on_groups_ou_edited':    self.on_groups_ou_edited,
            'on_uri_cellrenderer_editing_started': self.on_uri_start_editing,
            'on_remove_button_clicked':         self.on_remove_button_cb,
            
            # Activate
            'on_treeview_row_activated':            self.on_connect_button_cb,
        }
        
        self.__builder.connect_signals(signals)
        
        image = gtk.Image()
        image.set_from_file(os.path.join(datapath, "ui/server.png"))
        self.__pixbuf = image.get_pixbuf()
        
        self.__credentials = (None, None, None, None, None)
        self.__old_uri = None
        
        for uri in self.__configuration.sections():
            if not self.__configuration.has_option(uri, "bind_dn"):
                bind_dn = _("Insert bind dn")
            else:
                bind_dn = self.__configuration.get(uri, "bind_dn")
            if self.__configuration.has_option(uri, "base_dn"):
                base_dn = self.__configuration.get(uri, "base_dn")
            else:
                base_dn = _("Insert base dn")
            if self.__configuration.has_option(uri, "users_ou"):
                users_ou = self.__configuration.get(uri, "users_ou")
            else:
                users_ou = _("Insert users organizational unit")
            if self.__configuration.has_option(uri, "groups_ou"):
                groups_ou = self.__configuration.get(uri, "groups_ou")
            else:
                groups_ou = _("Insert groups organizational unit")
            
            self.__builder.get_object("server_store").append((self.__pixbuf, uri, bind_dn,
                                            base_dn, users_ou, groups_ou))

        self.__dialog.set_title(_("Connection to LDAP server"))
示例#12
0
文件: treeviews.py 项目: robol/lum
    def __init__(self, model, parent):
        """
        Create the new UserTreeView starting from
        a UserStore
        """

        gtk.TreeView.__init__(self)
        self.set_model(model)
        self.__model = model
        self.__parent = parent

        # Create popup menu
        self.__popup_menu = lumUserTreeViewMenu(self.__parent)
        self.connect("button-press-event", self.on_button_press_event)

        # Load pixbuf
        pixbuf_path = os.path.join(package_dir, "ui", "user.png")
        pixbuf_image = gtk.Image()
        pixbuf_image.set_from_file(pixbuf_path)
        pixbuf = pixbuf_image.get_pixbuf()

        # User image column
        renderer = gtk.CellRendererPixbuf()
        renderer.set_property("pixbuf", pixbuf)
        column = gtk.TreeViewColumn()
        column.pack_start(renderer, True)
        column.set_expand(False)
        self.append_column(column)
        

        # username column
        renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn()
        column.pack_start(renderer)
        column.set_title(_("User"))
        column.add_attribute(renderer, "text", 0)
        column.set_expand(True)
        self.append_column(column)

        # Name column
        renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn()
        column.set_title(_("Name"))
        column.pack_start(renderer)
        column.add_attribute(renderer, "text", 1)
        column.set_expand(True)
        self.append_column(column)

        # group column
        renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn()
        column.pack_start(renderer)
        column.set_title(_("Group"))
        column.add_attribute(renderer, "text", 2)
        column.set_expand(True)
        self.append_column(column)
示例#13
0
文件: app.py 项目: robol/lum
    def missing_ou_cb(self, widget, missing_ou):
        """Callback to ask user if he/she wants to add
        missing ous before continue"""

        text = "\n".join(map(lambda x : "- <b>" + x + "</b>", missing_ou))
        if ask_question(_("The following organizational units are missing in the database, add them?\n%s" % text)):
            for ou in missing_ou:
                self.__connection.add_ou(ou, True)
        else:
            show_info_dialog(_("You will not be able to perform any operation without these OUs"))
            self.disconnect()
示例#14
0
    def run(self):
        """Run dialog"""
        
        # Check if the user says "save"...
        if self.__window.run() == 1:
            
            # And then retrieve data
            username = self.__builder.get_object("username_entry").get_text()
            givenName = self.__builder.get_object("givenName_entry").get_text()
            sn = self.__builder.get_object("sn_entry").get_text()
            home = self.__builder.get_object("home_entry").get_text()
            shell = self.__builder.get_object("shell_entry").get_text()
            email = self.__builder.get_object("email_entry").get_text()
            
            # Set uid to 0 so ldap_protocol will autodetermine the first free uid
            # when creating the user
            uid = 0
            
            group = self.__builder.get_object("group_entry").get_text()
            gid = self.__connection.gid_from_group(group)
            
            # Check if this is an existent user
            if self.__connection.is_present("uid=%s" % username):
                show_error_dialog(_("User %s is present, not overwriting it!") % username)
                self.__window.destroy()
                return None
            
            # Ask the user if he intended to create the group and destroy window
            # before the call to the ldap module, that could raise an exception
            # catched by our parent (i.e. lumApp)
            if gid is None:
                if ask_question(_("The group %s doesn't exists, create it now?") % group):
                    self.__window.destroy()
                    self.__connection.add_group(group)
                    gid = self.__connection.gid_from_group(group)
                else:
                    self.__window.destroy()
                    return None
            else:
                self.__window.destroy()
            
            # Fill UserModel
            self.usermodel = UserModel()
            self.usermodel.set_username(username)
            self.usermodel.set_gid(gid)
            self.usermodel.set_surname(sn)
            self.usermodel.set_given_name(givenName)
            self.usermodel.set_home(home)
            self.usermodel.set_shell(shell)
            self.usermodel.set_email(email)

        else:
            
            self.__window.destroy()
示例#15
0
文件: app.py 项目: robol/lum
 def __check_connection(self):
     if self.__connection is None:
         if ask_question(_("Not connected to any LDAP server, connect now?")):
             self.connect ()
         else:
             return False
     if self.__connection is not None:
         return True
     else:
         show_error_dialog(_("Error while connecting to LDAP server, aborting operation."))
         return False
示例#16
0
def watchlist_movies():
    """Create movie watchlist window"""
    movies = utilities.getWatchlistMoviesFromTrakt()

    if movies == None: # movies = None => there was an error
        return # error already displayed in utilities.py

    if len(movies) == 0:
        xbmcgui.Dialog().ok(_(200), _(134))
        return

    _create_window('watchlist', movies, _WINDOW_TYPE_MOVIES)
示例#17
0
def watchlist_tv():
    """Create TV show watchlist window"""
    tvshows = utilities.getWatchlistTVShowsFromTrakt()

    if tvshows == None: # tvshows = None => there was an error
        return # error already displayed in utilities.py

    if len(tvshows) == 0:
        xbmcgui.Dialog().ok(_(200), _(135))
        return

    _create_window('watchlist', tvshows, _WINDOW_TYPE_TV)
示例#18
0
def sync_movies(daemon=False):
    """Sync playcounts and collection status between trakt and xbmc.

    Scans XBMC and trakt and updates the play count of each movie in both the xbmc
    and trakt libraries based on which is higher. If the movie exists in xbmc
    but is not collected in trakt it is set as collected too.
    """
    if not daemon:
        progress = xbmcgui.DialogProgress()
        progress.create(_(200), _(172))

    # Generate list of movies keyed with their imdb id
    trakt_movies = utilities.traktMovieListByImdbID(utilities.getMoviesFromTrakt())
    xbmc_movies = utilities.xbmcMovieListByImdbID(utilities.getMoviesFromXBMC())

    xbmc_playcount_update = []
    trakt_playcount_update = []
    trakt_collection_update = []

    for imdbid in xbmc_movies:
        if imdbid not in trakt_movies:
            trakt_collection_update.append({'imdb_id': imdbid, 'title': xbmc_movies[imdbid]['title'], 'year': xbmc_movies[imdbid]['year']})

            if xbmc_movies[imdbid]['playcount'] > 0:
                trakt_playcount_update.append({'imdb_id': imdbid, 'title': xbmc_movies[imdbid]['title'], 'year': xbmc_movies[imdbid]['year'], 'plays': xbmc_movies[imdbid]['playcount'], 'last_played': xbmc_movies[imdbid]['lastplayed']})

            continue

        if xbmc_movies[imdbid]['playcount'] > trakt_movies[imdbid]['plays']:
            trakt_playcount_update.append({'imdb_id': imdbid, 'title': xbmc_movies[imdbid]['title'], 'year': xbmc_movies[imdbid]['year'], 'plays': xbmc_movies[imdbid]['playcount'], 'last_played': xbmc_movies[imdbid]['lastplayed']})
        elif xbmc_movies[imdbid]['playcount'] < trakt_movies[imdbid]['plays']:
            xbmc_playcount_update.append((xbmc_movies[imdbid]['movieid'], trakt_movies[imdbid]['plays'], imdbid))

    if not daemon:
        progress.update(0, _(173))

    if len(trakt_collection_update) > 0:
        utilities.traktJsonRequest('POST', '/movie/library/%%API_KEY%%', {'movies': trakt_collection_update})

    if len(trakt_playcount_update) > 0:
        utilities.setMoviesSeenOnTrakt(trakt_playcount_update)

    if len(xbmc_playcount_update) > 0:
        if not daemon:
            _update_xbmc_movie_playcounts(xbmc_playcount_update, progress, daemon)
        else:
            _update_xbmc_movie_playcounts(xbmc_playcount_update, None, True)

    if not daemon:
        progress.close()
示例#19
0
def recommended_tv():
    """Create recommended shows window"""
    tvshows = utilities.getRecommendedTVShowsFromTrakt()

    if tvshows == None: # tvshows = None => there was an error
        return # error already displayed in utilities.py

    if len(tvshows) == 0:
        xbmcgui.Dialog().ok(_(200), _(121))
        return

    for tvshow in tvshows:
        tvshow['watchlist'] = tvshow['in_watchlist']

    _create_window('recommended', tvshows, _WINDOW_TYPE_TV)
示例#20
0
文件: app.py 项目: robol/lum
 def disconnect(self, menu_item = None):
     self.clear_user_list()
     self.clear_group_list()
     self.__connection = None
     if self.__uri is not None:
         self.statusbar_update(_("Disconnected from %s") % self.__uri)
         self.__uri = None
示例#21
0
def _update_xbmc_movie_playcounts(playcount_list, progress, daemon):
    """Updates playcounts from the list passed to it and updates the progress bar"""
    count = len(playcount_list)
    index = 0

    if not daemon:
        progress.update(0, _(170))

    for movieid, playcount, imdbid in playcount_list:
        utilities.setXBMCMoviePlaycount(movieid, playcount, imdbid)
        index += 1

        if not daemon:
            if progress.iscanceled():
                return
            progress.update(int(float(index)/count*100), _(170))
示例#22
0
def sync_tv(daemon=False):
    """Sync playcounts and collection status between trakt and xbmc.

    Scans XBMC and trakt and updates the playcount of each episode in both the
    xbmc and trakt libraries. If the episode exists in xbmc but is not collected
    on trakt it is also set as collected on trakt.
    """
    collect_episodes = []
    watch_episodes = []

    if not daemon:
        progress = xbmcgui.DialogProgress()
        progress.create(_(200), _(174))

    xbmc_shows = _parse_xbmc_structure()
    trakt_shows = _parse_trakt_structure()

    index = 0
    length = len(xbmc_shows)

    for tvdbid in xbmc_shows:
        if not daemon:
            if progress.iscanceled():
                return
            progress.update(int(float(index)/length*100), _(175))

        index += 1

        if tvdbid not in trakt_shows:
            collect_trakt_episodes, watch_trakt_episodes = _generate_show_not_on_trakt(xbmc_shows, tvdbid)
        else:
            collect_trakt_episodes, watch_trakt_episodes, watched_xbmc_episodes = _generate_show_on_trakt(xbmc_shows, trakt_shows, tvdbid)
            _update_xbmc_episode_playcounts(watched_xbmc_episodes)

        if collect_trakt_episodes:
            collect_episodes.append(collect_trakt_episodes)
        if watch_trakt_episodes:
            watch_episodes.append(watch_trakt_episodes)

    if not daemon:
        progress.update(0, _(176))

    _send_episodes_to_trakt(collect_episodes, watch_episodes)

    if not daemon:
        progress.close()
示例#23
0
文件: menu_item.py 项目: robol/lum
    def __init__(self, parent):
        gtk.Menu.__init__(self)

        # Save internal data
        self.__parent = parent
        self.__delete_button = gtk.MenuItem(_("Delete"))
        self.__properties_button = gtk.MenuItem(_("Properties"))
        self.__edit_button = gtk.MenuItem(_("Edit members"))
        
        for it in (self.__delete_button, self.__properties_button,
                   self.__edit_button):
            self.append(it)
            it.show()

        self.__delete_button.connect("activate", self.delete_cb)
        self.__properties_button.connect("activate", self.properties_cb)
        self.__edit_button.connect("activate", self.edit_button_cb)
示例#24
0
    async def extensions(self, ctx):

        # create output embeds
        embed_loaded = discord.Embed(colour=discord.Colour.green(),
                                     title=_("loaded extensions"))
        embed_unloaded = discord.Embed(colour=discord.Colour.red(),
                                       title=_("unloaded extensions"))

        # get loaded extension
        loaded_extensions = Extension.loaded()
        if loaded_extensions:
            for extension in loaded_extensions:
                embed_loaded.add_field(name=extension.name,
                                       value=extension.description,
                                       inline=False)
        else:
            embed_loaded.add_field(name=_("no extensions"),
                                   value=_("no extensions loaded"),
                                   inline=False)

        # get unloaded extension
        unloaded_extensions = Extension.unloaded()
        if unloaded_extensions:
            for extension in unloaded_extensions:
                embed_unloaded.add_field(name=extension.name,
                                         value=_(extension.description),
                                         inline=False)
        else:
            embed_unloaded.add_field(name=_("no extensions"),
                                     value=_("no extensions unloaded"),
                                     inline=False)

        # send embeds
        await ctx.send(embed=embed_loaded)
        await ctx.send(embed=embed_unloaded)
示例#25
0
 def verify(user_id: UUID):
     user = User.get(user_id=str(user_id))
     if user is None:
         return {'error': 'invalid user ID'}, 404
     user.verified_at = datetime.now()
     db_session.commit()
     self.loop.run_until_complete(self.add_role(user.discord_id))
     return """
     <html lang="{language}">
         <head>
             <title>Fachschaft 5 | Verified!</title>
         </head>
         <body>
             <p style='margin: auto;'>{content}</p>
         </body>
     </html>
     """.format(language=_('language'),
                content=_('you can close this window now'))
示例#26
0
    async def verify(self, ctx: Context, username: str = None):
        if ctx.channel.type != ChannelType.private:
            return await ctx.send(embed=Embed(
                color=Color.gold(),
                title=_('unsupported'),
                description=_('only supported in dm'),
            ))
        if username is None or username == '':
            return await ctx.send(embed=Embed(
                color=Color.red(),
                title=_('Errors'),
                description=_('provide username'),
            ))
        discord_id = ctx.author.id
        if User.exists(discord_id=discord_id):
            user = User.get(discord_id=discord_id)
            return await ctx.send(embed=Embed(
                color=Color.gold(),
                description=_('user already verified {mail} {username}').format(
                    mail=user.mail_address,
                    username=username,
                ),
            )) if user.verified_at is not None else await ctx.send(embed=Embed(
                color=Color.gold(),
                description=_('already sent verification {mail} {username}').format(
                    mail=user.mail_address,
                    username=username,
                ),
            ))
        await ctx.send(embed=Embed(
            color=Color.green(),
            description=_('sent verification mail {username}').format(username=username),
        ))
        mail_address = f'{username}@alumni.fh-aachen.de'
        user_id = str(uuid4())
        db_session.add(User(
            id=user_id,
            discord_id=discord_id,
            mail_address=mail_address,
        ))
        db_session.commit()
        message = f"""From: No-Reply <{self.config['verification']['mail_user']}>
To: {ctx.author.name} <{mail_address}>
Subject: Fachschaft 5 Discord Verification

Hello {ctx.author.name},

Visit this link to verify your Discord account:
    {self.config['verification']['host']}:{self.config['verification']['port']}{self.config['verification']['endpoint']}/{user_id}

Best regards
"""

        try:
            client = smtplib.SMTP_SSL(self.config['verification']['mail_server'], 465)
            client.login(self.config['verification']['mail_user'], self.config['verification']['mail_pass'])
            client.sendmail(self.config['verification']['mail_user'], [mail_address], message)
        except smtplib.SMTPException as err:
            logging.error(str(err))
示例#27
0
def trending_tv():
    """Create trending shows window"""
    tvshows = utilities.getTrendingTVShowsFromTrakt()
    watchlist = utilities.traktShowListByTvdbID(utilities.getWatchlistTVShowsFromTrakt())

    if tvshows == None: # tvshows = None => there was an error
        return # error already displayed in utilities.py

    if len(tvshows) == 0:
        xbmcgui.Dialog().ok(_(200), _(161))
        return

    for tvshow in tvshows:
        if tvshow['imdb_id'] in watchlist:
            tvshow['watchlist'] = True
        else:
            tvshow['watchlist'] = False

    _create_window('trending', tvshows, _WINDOW_TYPE_TV)
示例#28
0
def main():
    if ADDON.getSetting('EraseCache') == 'true':
        try:
            urlcache.URLCache(ADDON_DATA_PATH).erase()
        finally:
            ADDON.setSetting('EraseCache', 'false')  #@UndefinedVariable

    if not API_KEY:
        raise Exception(_("No API Key."),
                        _("Enter your Met Office API Key under settings."))

    properties.observation()
    properties.daily()
    properties.threehourly()

    WINDOW.setProperty('WeatherProvider',
                       ADDON.getAddonInfo('name'))  #@UndefinedVariable
    WINDOW.setProperty('WeatherProviderLogo',
                       ADDON_BANNER_PATH)  #@UndefinedVariable
    WINDOW.setProperty(
        'ObservationLocation',
        ADDON.getSetting('ObservationLocation'))  #@UndefinedVariable
    WINDOW.setProperty(
        'Current.Location',
        ADDON.getSetting('ForecastLocation'))  #@UndefinedVariable
    WINDOW.setProperty(
        'ForecastLocation',
        ADDON.getSetting('ForecastLocation'))  #@UndefinedVariable
    WINDOW.setProperty(
        'RegionalLocation',
        ADDON.getSetting('RegionalLocation'))  #@UndefinedVariable
    WINDOW.setProperty(
        'Location1', ADDON.getSetting('ForecastLocation'))  #@UndefinedVariable
    WINDOW.setProperty('Locations', '1')  #@UndefinedVariable

    #Explicitly set unused flags to false, so there are no unusual side
    #effects/residual data when moving from another weather provider.
    WINDOW.setProperty('36Hour.IsFetched', '')  #@UndefinedVariable
    WINDOW.setProperty('Weekend.IsFetched', '')  #@UndefinedVariable
    WINDOW.setProperty('Map.IsFetched', '')  #@UndefinedVariable
    WINDOW.setProperty('Today.Sunrise', '')  #@UndefinedVariable
    WINDOW.setProperty('Today.Sunset', '')  #@UndefinedVariable
    WINDOW.setProperty('Weather.CurrentView', '')  #@UndefinedVariable
示例#29
0
def trending_movies():
    """Create tending movies window"""
    movies = utilities.getTrendingMoviesFromTrakt()
    watchlist = utilities.traktMovieListByImdbID(utilities.getWatchlistMoviesFromTrakt())

    if movies == None: # movies = None => there was an error
        return # error already displayed in utilities.py

    if len(movies) == 0:
        xbmcgui.Dialog().ok(_(200), _(160))
        return

    for movie in movies:
        if movie['imdb_id'] in watchlist:
            movie['watchlist'] = True
        else:
            movie['watchlist'] = False

    _create_window('trending', movies, _WINDOW_TYPE_MOVIES)
示例#30
0
文件: menu_item.py 项目: robol/lum
    def __init__(self, parent):
        gtk.Menu.__init__(self)
        
        self.__parent = parent
        self.__edit_button = gtk.MenuItem(_("Edit"))
        self.__del_button  = gtk.MenuItem(_("Delete"))
        self.__pwd_button  = gtk.MenuItem(_("Change password"))

        self.append (self.__edit_button)
        self.append (self.__del_button)
        self.append (self.__pwd_button)
        
        self.__edit_button.show()
        self.__del_button.show()
        self.__pwd_button.show()
        
        self.__edit_button.connect("activate", self.edit)
        self.__del_button.connect("activate",  self.delete)
        self.__pwd_button.connect("activate",  self.change_password)
        
        self.username = None
示例#31
0
文件: gui.py 项目: Pavit/pyofx
    def on_download_clicked(self):
        """ Read GUI widgets """
        # Client instance attributes
        client_opts = {key: self.read_widget(getattr(self, key))
                        for key in OFXClient.defaults.keys()}
        client = OFXClient(**client_opts)

        # Statement options
        stmt_options = {}
        for option in OFXClient.stmt_defaults.keys():
            widget = getattr(self, option, None)
            stmt_options[option] = self.read_widget(widget)

        # Account numbers
        accts = {key: self.read_widget(getattr(self, key))
                        for key in OFXClient.acct_defaults.keys()}
        acct_tuple = client.parse_account_strings(**accts)

        client.request_all(*acct_tuple, **stmt_options)
        user = self.read_widget(self.user)

        if self.dry_run.isChecked():
            request = client.write_request(user, 'TOPSECRET')
            msg = QtGui.QMessageBox(self, windowTitle='OFX Request',
                text='OFX request prepared for %s' % self.fi_name)
            msg.setDetailedText(request)
            msg.exec_()
            return

        password = self.get_password(user)

        if self.profile.isChecked():
            client.request_profile(user=user, password=password)
            archive_file = 'profile.ofx'
        else:
            client.write_request(user=user, password=password)
            # FIXME - ought to use DTCLIENT from the SONRQ here
            import datetime
            archive_file = '%s.ofx' % datetime.datetime.now().strftime('%Y%m%d%H%M%S')
        response = client.download(user, password)
        clicked = self.popup_response(response.read())
        if clicked == QtGui.QMessageBox.Save:
            archive_dir = _(os.path.join(self.config.get('global', 'dir'), self.fi_name))
            if archive_dir == '':
                return
            if not os.path.exists(archive_dir):
                os.makedirs(archive_dir)
            archive_path = os.path.join(archive_dir, archive_file)
            archive_path = QtGui.QFileDialog.getSaveFileName(self,
                            directory=archive_path,
                            filter='OFX files (*.ofx);;All files (*)')
            with open(archive_path, 'w') as archive:
                archive.write(response.read())
示例#32
0
def main(location):
    if not API_KEY:
        raise Exception(_("No API Key."), _("Enter your Met Office API Key under settings."))

    KEYBOARD.doModal()#@UndefinedVariable
    text= KEYBOARD.isConfirmed() and KEYBOARD.getText()#@UndefinedVariable
    sitelist = getsitelist(location, text)
    if sitelist == []:
        DIALOG.ok(_("No Matches"), _("No locations found containing")+" {0}".format(text))#@UndefinedVariable
        utilities.log("No locations found containing '%s'" % text)
    else:
        display_list = [site['display'] for site in sitelist]
        selected = DIALOG.select(_("Matching Sites"), display_list)#@UndefinedVariable
        if selected != -1:
            ADDON.setSetting(location, sitelist[selected]['name'])#@UndefinedVariable
            ADDON.setSetting("%sID" % location, sitelist[selected]['id'])#@UndefinedVariable
            ADDON.setSetting("%sLatitude" % location, str(sitelist[selected].get('latitude')))#@UndefinedVariable
            ADDON.setSetting("%sLongitude" % location, str(sitelist[selected].get('longitude')))#@UndefinedVariable
            utilities.log("Setting '{location}' to '{name} ({distance})'".format(location=location,
                                                                         name=sitelist[selected]['name'].encode('utf-8'),
                                                                         distance=sitelist[selected]['id']))
示例#33
0
    def new_user(self, button):
        """Create a new empty row"""
        store = self.__builder.get_object("members_store")
        it = store.append((_("Insert uid here"),))

        # Get path
        path = store.get_path(it)
        
        # Start editing the new entry
        treeview = self.__builder.get_object("members_treeview")
        column = self.__builder.get_object("members_column")
        treeview.set_cursor(path, column, True)
示例#34
0
文件: app.py 项目: robol/lum
    def new_group(self, menu_item = None):
        """Create a new group catching the callback from menu"""
        if not self.__check_connection():
            return None

        new_group_dialog = lumNewGroupDialog(self.__datapath,
                                             self.__connection)
        group_name, gid = new_group_dialog.run()

        if group_name is not None:
            try:
                self.__connection.add_group(group_name, gid)
            except LumInsufficientPermissionsError:
                show_error_dialog(_("Insufficient permissions to create group"))
                return None
            except LumAlreadyExistsError:
                show_error_dialog(_("Group <b>%s</b> already exists in the database," + 
                                    " cannot add one more.") % group_name)
                return None

            self.__group_store.append(gid, group_name)
            self.statusbar_update(_("Group %s successfully created.") % group_name)
示例#35
0
def main():
    if ADDON.getSetting('EraseCache') == 'true':
        try:
            urlcache.URLCache(ADDON_DATA_PATH).erase()
        finally:
            ADDON.setSetting('EraseCache', 'false')  #@UndefinedVariable

    if not API_KEY:
        raise Exception(_("No API Key."),
                        _("Enter your Met Office API Key under settings."))

    if len(sys.argv) > 1 and sys.argv[1].isdigit():
        properties.observation()
    if not CURRENT_VIEW:
        properties.daily()
    elif CURRENT_VIEW == '3hourly':
        properties.threehourly()
    elif CURRENT_VIEW == 'forecastmap':
        properties.forecastlayer()
    elif CURRENT_VIEW == 'observationmap':
        properties.observationlayer()
    elif CURRENT_VIEW == 'text':
        properties.text()

    WINDOW.setProperty('WeatherProvider',
                       ADDON.getAddonInfo('name'))  #@UndefinedVariable
    WINDOW.setProperty(
        'ObservationLocation',
        ADDON.getSetting('ObservationLocation'))  #@UndefinedVariable
    WINDOW.setProperty(
        'ForecastLocation',
        ADDON.getSetting('ForecastLocation'))  #@UndefinedVariable
    WINDOW.setProperty(
        'RegionalLocation',
        ADDON.getSetting('RegionalLocation'))  #@UndefinedVariable
    WINDOW.setProperty(
        'Location1',
        ADDON.getSetting('ObservationLocation'))  #@UndefinedVariable
    WINDOW.setProperty('Locations', '1')  #@UndefinedVariable
示例#36
0
文件: app.py 项目: robol/lum
    def change_password(self, menu_item = None):
        """Change password of selected user"""
        usermodel, t_iter = self.__get_selected_user()
        if t_iter is None:
            show_info_dialog(_("You need to select a user to change its password"))
            return


        password_dialog = lumChangeUserPasswordDialog(self.__datapath, usermodel.get_username())
        new_password = password_dialog.run()

        if new_password is None:
            return False
        else:
            try:
                self.__connection.change_password(usermodel.get_username(), new_password)
            except LumInsufficientPermissionsError:
                show_error_dialog(_("Insufficient permissions to change user password"))
                return False
            else:
                self.statusbar_update(_("Password of user %s changed succesfully") % usermodel.get_username())
            return True
示例#37
0
    async def load(self, ctx, extension: str):
        # prepare extension string
        extension = extension.lower()

        # check if extension is not on blacklist
        if extension not in self.extension_blacklist:

            # try to load extension
            try:
                # load extension
                self.bot.load_extension(self.extensions_dir + extension)

                # check extension in database and update/set
                db_extension = Extension.get(extension)
                if db_extension:
                    db_extension.isLoaded = True
                else:
                    extension_object = Extension(extension, True)
                    db_session.add(extension_object)

                # commit update
                db_session.commit()

            except Exception as e:
                # create output embed
                embed = discord.Embed(
                    colour=discord.Colour.red(),
                    title=_("extension not loaded, {extension}").format(
                        extension=extension))
                embed.add_field(name=_("Errors"),
                                value="{}: {}".format(type(e).__name__, e),
                                inline=False)

                # send embed
                await ctx.send(embed=embed)
            else:
                # create output embed
                embed = discord.Embed(
                    colour=discord.Colour.green(),
                    title=_("extension successfully loaded, {extension}"
                            ).format(extension=extension))
                # send embed
                await ctx.send(embed=embed)
        else:
            # create output embed
            embed = discord.Embed(
                colour=discord.Colour.red(),
                title=_("extension not loaded, {extension}").format(
                    extension=extension))
            embed.add_field(name=_("Errors"),
                            value=_("extension blacklist"),
                            inline=False)

            # send embed
            await ctx.send(embed=embed)
示例#38
0
    async def reload(self, ctx, extension: str):
        # prepare extension string
        extension = extension.lower()

        # check if extension is not on blacklist
        if extension not in self.extension_blacklist:
            # try to reload extension
            try:
                self.bot.unload_extension(self.extensions_dir + extension)
                self.bot.load_extension(self.extensions_dir + extension)
            except Exception as e:
                # create output embed
                embed = discord.Embed(
                    colour=discord.Colour.red(),
                    title=_("extension not reloaded, {extension}").format(
                        extension=extension))
                embed.add_field(name=_("Errors"),
                                value="{}: {}".format(type(e).__name__, e),
                                inline=False)

                # send embed
                await ctx.send(embed=embed)
            else:
                # create output embed
                embed = discord.Embed(
                    colour=discord.Colour.green(),
                    title=_("extension successfully reloaded, {extension}"
                            ).format(extension=extension))
                # send embed
                await ctx.send(embed=embed)
        else:
            # create output embed
            embed = discord.Embed(
                colour=discord.Colour.red(),
                title=_("extension not reloaded, {extension}").format(
                    extension=extension))
            embed.add_field(name=_("Errors"),
                            value=_("extension blacklist"),
                            inline=False)

            # send embed
            await ctx.send(embed=embed)
示例#39
0
文件: fun.py 项目: Fachschaft5/fs5bot
 async def dice(self, ctx):
     await ctx.send(
         _("dice role, {mention}, {dice}").format(
             mention=ctx.author.mention, dice=random.randint(1, 6)))