Re: Re: installing an end user editable file
Hey mentors,
Firstly, thanks for all the help so far.
I like the idea of having a default copy of the file used by my
program, as suggested by Lars and PJ, so I've altered my source code
to use a default file and allow multiple users to have their own
copies of this file in their home/<user>/Documents folder.
"creating a default file in /usr/share and having the program copy it
to the user's directory when it's run"
However, I can't open a file from /usr/share via my python script as I
don't have permission to open files in a protected directory, and
after reading up a bit on it, it's been suggested that it's bad form
to invoke super user in a script, as it's construed as a security risk
(i.e. http://tldp.org/HOWTO/Security-HOWTO/file-security.html;
http://www.velocityreviews.com/forums/t346075-sudo-open-python-newbee-question.html)
Do I really have to use sudo or super user privileges to just open and
copy a text template?
Where do packagers normally install files of this type?
I thought it might be a good idea to store it in
home/<user>/.<packageName> But I'm still at a loss as to how I can
find a users home directory from the rules makefile :(
been trying to use ~/ and $XDG_CONFIG_HOME but I just end up with
everything being installed in folders called "~" or "DG_CONFIG_HOME"
Here's the source code if you need more info:
#!/usr/bin/python
# Code Name: gtk-link-lizard
# Created By: Jim Frize, <http://sonodrome.co.uk>
# Copyright (C) 2011 Jim Frize, <jim@sonodrome.co.uk>
# Licence: GTK Link Lizard is free software: you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version. This program is
distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details. You should have received a copy of the GNU General
Public License along with this program. If not, see
<http://www.gnu.org/licenses/>
# Version: 1.5
# Description: Simple GUI for storing and displaying web links
# This GUI will do away with synchronizing bookmarks between browsers,
web links are stored in a regular text file which is found in your
documents folder. GTK Link Lizard makes it easy to edit, swap or
replace a list of clickable links
import pygtk
pygtk.require("2.0")
import gtk
import sys
import re
import os
path = os.getenv("HOME")
class link_lizard():
def __init__(self):
self.load_main()
#############
# Load File #
#############
def load_file(self):
try:
self.text_file = open(path +
"/Documents/gtk-link-lizard/links.txt","r+")
except IOError:
print "loading links.txt from usr/share/doc/gtk-link-lizard..."
try:
self.text_file =
open("usr/share/doc/gtk-link-lizard/links.txt","r")
self.text_file.write(path +
"/Documents/gtk-link-lizard/links.txt")
self.text_file = open(path +
"/Documents/gtk-link-lizard/links.txt","r+")
except IOError:
print "ERROR: link.txt not found"
#################
# Load main GUI #
#################
def load_main(self, data=None):
# Create main window
self.main_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
# Quit main function when window is destroyed
self.main_window.connect("destroy", gtk.main_quit)
self.main_window.set_size_request(600, 600)
self.main_window.set_position(gtk.WIN_POS_CENTER)
self.main_window.set_opacity(0.9)
self.main_window.set_title("GTK Link Lizard")
self.main_window.set_keep_above(True)
# Create scrolled window
scrolled_window = gtk.ScrolledWindow()
scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
# Create placement boxes and dictionaries
main_box = gtk.VBox(homogeneous=False)
link_box = gtk.VBox(homogeneous=False)
linkbutton = {}
label = {}
# Create edit button
edit_button = gtk.Button("Edit Links")
edit_button.connect("clicked", self.load_edit)
# Count number of lines in text file
self.load_file()
number_lines = len(self.text_file.readlines())
# Reset counter and check through each line of text
count = 0
while(count < number_lines):
self.load_file()
all_lines = self.text_file.readlines()
current_line = all_lines[count]
match = re.search("http://", current_line)
match2 = re.search("https://", current_line)
match3 = re.search("www.", current_line)
# If http link is found, make a linkButton
if match:
current_url = match.group()
# Remove http://
split_line = current_line.split("http://")
if match3:
# Remove www.
split_line = split_line[1].split("www.")
linkbutton[count] = gtk.LinkButton(current_line, split_line[1])
linkbutton[count].set_size_request(600, 30)
link_box.pack_start(linkbutton[count], expand=False)
# If https link is found, make a linkButton
elif match2:
current_url = match2.group()
# Remove https://
split_line = current_line.split("https://")
if match3:
# Remove www.
split_line = split_line[1].split("www.")
linkbutton[count] = gtk.LinkButton(current_line, split_line[1])
linkbutton[count].set_size_request(600, 30)
link_box.pack_start(linkbutton[count], expand=False)
# If no link is found, add text as a label
else:
label[count] = gtk.Label(current_line)
label[count].set_size_request(600, 20)
link_box.pack_start(label[count], expand=False)
count+=1
# Add everything
main_box.pack_start(edit_button, expand=False)
scrolled_window.add_with_viewport(link_box)
main_box.add(scrolled_window)
self.main_window.add(main_box)
self.main_window.show_all()
#################
# Load edit GUI #
#################
def load_edit(self, data=None):
# Hide main window
self.main_window.hide()
# Create edit window
self.edit_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
# Return to main window when edit window is destroyed
self.edit_window.connect("destroy", self.load_main)
self.edit_window.set_size_request(600, 600)
self.edit_window.set_position(gtk.WIN_POS_CENTER)
self.edit_window.set_title("GTK Link Lizard (Editing Links)")
# Create scrolled window
scrolled_window = gtk.ScrolledWindow()
scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
# Create boxes for layout
main_box = gtk.VBox(homogeneous=False)
text_box = gtk.VBox(homogeneous=False)
button_box = gtk.HBox(homogeneous=False)
# Create buttons
save_button = gtk.Button("Save")
save_button.connect("clicked", self.save_edit)
cancel_button = gtk.Button("Cancel")
cancel_button.connect("clicked", self.cancel_edit)
# Open file and display in text viewer
self.load_file()
all_text = self.text_file.read()
text_buffer = gtk.TextBuffer()
text_buffer.set_text(all_text)
self.text_view = gtk.TextView(text_buffer)
# Add everything
button_box.add(save_button)
button_box.add(cancel_button)
text_box.add(self.text_view)
scrolled_window.add_with_viewport(text_box)
main_box.pack_start(button_box, expand=False)
main_box.add(scrolled_window)
self.edit_window.add(main_box)
self.edit_window.show_all()
#############
# Save edit #
#############
def save_edit(self, data=None):
save_buffer = self.text_view.get_buffer()
save_text = save_buffer.get_text(save_buffer.get_start_iter(),
save_buffer.get_end_iter())
self.load_file()
self.text_file.write(save_text)
self.edit_window.destroy()
###############
# Cancel edit #
###############
def cancel_edit(self, data=None):
self.edit_window.destroy()
#################
# Main function #
#################
def main(self):
gtk.main()
# Run main function when class is called
if __name__ == "__main__":
new_link_lizard = link_lizard()
new_link_lizard.main()
Reply to: