[WebUI][Console] Add missing columns and statuses

Rename 'Seeders' to 'Seeds'
Hide seconds from fdate unless wanted
'Last Seen Complete' renamed to 'Complete Seen'
Added columns and status for Completed date
Rename 'Seeders/Peers' to 'Seeds:Peers'
For translation added colon to WebUI status strings to match GTK
This commit is contained in:
Calum Lind 2014-02-17 13:44:14 +00:00
commit aa5e5178d3
14 changed files with 355 additions and 255 deletions

View file

@ -446,19 +446,24 @@ def ftime(seconds):
return '%dy %dw' % (years, weeks) return '%dy %dw' % (years, weeks)
def fdate(seconds): def fdate(seconds, date_only=False, precision_secs=False):
""" """
Formats a date time string in the locale's date representation based on the systems timezone Formats a date time string in the locale's date representation based on the systems timezone
:param seconds: time in seconds since the Epoch :param seconds: time in seconds since the Epoch
:type seconds: float :type seconds: float
:param precision_secs: include seconds in time format
:type precision_secs: bool
:returns: a string in the locale's datetime representation or "" if seconds < 0 :returns: a string in the locale's datetime representation or "" if seconds < 0
:rtype: string :rtype: string
""" """
if seconds < 0: if seconds < 0:
return "" return ""
if precision_secs:
return time.strftime("%x %X", time.localtime(seconds)) return time.strftime("%x %X", time.localtime(seconds))
else:
return time.strftime("%x %H:%M", time.localtime(seconds))
def is_url(url): def is_url(url):

View file

@ -150,7 +150,7 @@ DEFAULT_PREFS = {
"show_size": True, "show_size": True,
"show_state": False, "show_state": False,
"show_progress": True, "show_progress": True,
"show_seeders":False, "show_seeds": False,
"show_peers": False, "show_peers": False,
"show_downspeed": True, "show_downspeed": True,
"show_upspeed": True, "show_upspeed": True,
@ -166,19 +166,25 @@ DEFAULT_PREFS = {
"show_owner": False, "show_owner": False,
"show_downloading_time": False, "show_downloading_time": False,
"show_seeding_time": False, "show_seeding_time": False,
"show_completed": False,
"show_seeds_peers_ratio": False,
"show_complete_seen": False,
"show_down_limit": False,
"show_up_limit": False,
"show_shared": False,
"queue_width": 4, "queue_width": 4,
"name_width": -1, "name_width": -1,
"size_width": 8, "size_width": 8,
"state_width": 13, "state_width": 13,
"progress_width": 7, "progress_width": 7,
"seeders_width":10, "seeds_width": 10,
"peers_width": 10, "peers_width": 10,
"downspeed_width": 7, "downspeed_width": 7,
"upspeed_width": 7, "upspeed_width": 7,
"eta_width": 8, "eta_width": 8,
"ratio_width": 10, "ratio_width": 10,
"avail_width": 10, "avail_width": 10,
"added_width":25, "added_width": 15,
"tracker_width": 15, "tracker_width": 15,
"savepath_width": 15, "savepath_width": 15,
"downloaded_width": 13, "downloaded_width": 13,
@ -187,6 +193,12 @@ DEFAULT_PREFS = {
"owner_width": 10, "owner_width": 10,
"downloading_time_width": 10, "downloading_time_width": 10,
"seeding_time_width": 10, "seeding_time_width": 10,
"completed_width": 15,
"seeds_peers_ratio_width": 10,
"complete_seen_width": 15,
"down_limit_width": 7,
"up_limit_width": 7,
"shared_width": 10,
"ignore_duplicate_lines": False, "ignore_duplicate_lines": False,
"move_selection": True, "move_selection": True,
"third_tab_lists_all": False, "third_tab_lists_all": False,
@ -204,12 +216,13 @@ DEFAULT_PREFS = {
"addtorrents_last_path": "~" "addtorrents_last_path": "~"
} }
column_pref_names = ["queue","name","size","state", column_pref_names = ["queue", "name", "size", "state", "progress", "seeds",
"progress","seeders","peers", "peers", "downspeed", "upspeed", "eta", "ratio", "avail",
"downspeed","upspeed","eta", "added", "tracker", "savepath","downloaded","uploaded",
"ratio","avail","added","tracker", "remaining", "owner","downloading_time","seeding_time",
"savepath","downloaded","uploaded", "remaining", "completed", "seeds_peers_ratio", "complete_seen",
"owner","downloading_time","seeding_time"] "down_limit", "up_limit", "shared",
]
prefs_to_names = { prefs_to_names = {
"queue": "#", "queue": "#",
@ -217,7 +230,7 @@ prefs_to_names = {
"size": "Size", "size": "Size",
"state": "State", "state": "State",
"progress": "Progress", "progress": "Progress",
"seeders":"Seeders", "seeds": "Seeds",
"peers": "Peers", "peers": "Peers",
"downspeed": "Down Speed", "downspeed": "Down Speed",
"upspeed": "Up Speed", "upspeed": "Up Speed",
@ -232,14 +245,20 @@ prefs_to_names = {
"remaining": "Remaining", "remaining": "Remaining",
"owner": "Owner", "owner": "Owner",
"seeding_time": "Seeding Time", "seeding_time": "Seeding Time",
"downloading_time":"Active Time" "downloading_time": "Active Time",
"complete_seen": "Complete Seen",
"completed": "Completed",
"seeds_peers_ratio": "Seeds:Peers",
"down_limit": "Down Limit",
"up_limit": "Up Limit",
"shared": "Shared"
} }
column_names_to_state_keys = { column_names_to_state_keys = {
"size": "total_wanted", "size": "total_wanted",
"downspeed": "download_payload_rate", "downspeed": "download_payload_rate",
"upspeed": "upload_payload_rate", "upspeed": "upload_payload_rate",
"seeders": "num_seeds", "seeds": "num_seeds",
"peers": "num_peers", "peers": "num_peers",
"avail": "distributed_copies", "avail": "distributed_copies",
"added": "time_added", "added": "time_added",
@ -249,8 +268,13 @@ column_names_to_state_keys = {
"downloaded": "all_time_download", "downloaded": "all_time_download",
"remaining": "total_remaining", "remaining": "total_remaining",
"seeding_time": "seeding_time", "seeding_time": "seeding_time",
"downloading_time":"active_time" "downloading_time": "active_time",
"complete_seen": "last_seen_complete",
"completed": "completed_time",
"seeds_peers_ratio": "seeds_peers_ratio",
"down_limit": "max_download_speed",
"up_limit": "max_upload_speed",
"shared": "shared"
} }
reverse_sort_fields = [ reverse_sort_fields = [
@ -323,20 +347,25 @@ class AllTorrents(BaseMode, component.Component):
("Downloaded", deluge.common.fsize, ("all_time_download",)), ("Downloaded", deluge.common.fsize, ("all_time_download",)),
("Uploaded", deluge.common.fsize, ("total_uploaded",)), ("Uploaded", deluge.common.fsize, ("total_uploaded",)),
("Share Ratio", format_utils.format_float, ("ratio",)), ("Share Ratio", format_utils.format_float, ("ratio",)),
("Seeders",format_utils.format_seeds_peers,("num_seeds","total_seeds")), ("Seeds", format_utils.format_seeds_peers, ("num_seeds", "total_seeds")),
("Peers", format_utils.format_seeds_peers,("num_peers", "total_peers")), ("Peers", format_utils.format_seeds_peers,("num_peers", "total_peers")),
("Active Time", deluge.common.ftime, ("active_time",)), ("Active Time", deluge.common.ftime, ("active_time",)),
("Seeding Time", deluge.common.ftime, ("seeding_time",)), ("Seeding Time", deluge.common.ftime, ("seeding_time",)),
("Date Added",deluge.common.fdate,("time_added",)), ("Complete Seen", format_utils.format_date_never, ("last_seen_complete",)),
("Date Added", format_utils.format_time, ("time_added",)),
("Completed", format_utils.format_date, ("completed_time",)),
("Availability", format_utils.format_float, ("distributed_copies",)), ("Availability", format_utils.format_float, ("distributed_copies",)),
("Pieces", format_utils.format_pieces, ("num_pieces", "piece_length")), ("Pieces", format_utils.format_pieces, ("num_pieces", "piece_length")),
("Seed Rank", str, ("seed_rank",)),
] ]
self.__status_keys = ["name", "state", "download_payload_rate", "upload_payload_rate", self.__status_keys = ["name", "state", "download_payload_rate", "upload_payload_rate",
"progress","eta","all_time_download","total_uploaded", "ratio", "progress", "eta", "save_path", "all_time_download", "total_uploaded",
"num_seeds","total_seeds","num_peers","total_peers", "active_time", "ratio", "num_seeds", "total_seeds", "num_peers", "total_peers",
"seeding_time","time_added","distributed_copies", "num_pieces", "active_time", "seeding_time", "last_seen_complete", "time_added",
"piece_length","save_path"] "completed_time", "distributed_copies", "num_pieces", "piece_length",
"seed_rank"
]
self.legacy_mode = Legacy(self.stdscr, self.encoding) self.legacy_mode = Legacy(self.stdscr, self.encoding)

View file

@ -53,7 +53,7 @@ columns = {
"Size": (("total_wanted",), deluge.common.fsize), "Size": (("total_wanted",), deluge.common.fsize),
"State": (("state",), None), "State": (("state",), None),
"Progress": (("progress",), format_utils.format_progress), "Progress": (("progress",), format_utils.format_progress),
"Seeders":(("num_seeds","total_seeds"),format_utils.format_seeds_peers), "Seeds": (("num_seeds","total_seeds"), format_utils.format_seeds_peers),
"Peers": (("num_peers","total_peers"), format_utils.format_seeds_peers), "Peers": (("num_peers","total_peers"), format_utils.format_seeds_peers),
"Down Speed": (("download_payload_rate",), format_utils.format_speed), "Down Speed": (("download_payload_rate",), format_utils.format_speed),
"Up Speed": (("upload_payload_rate",), format_utils.format_speed), "Up Speed": (("upload_payload_rate",), format_utils.format_speed),
@ -67,8 +67,14 @@ columns = {
"Uploaded": (("total_uploaded",), deluge.common.fsize), "Uploaded": (("total_uploaded",), deluge.common.fsize),
"Remaining": (("total_remaining",), deluge.common.fsize), "Remaining": (("total_remaining",), deluge.common.fsize),
"Owner": (("owner",), None), "Owner": (("owner",), None),
"Shared": (("shared",), str),
"Active Time": (("active_time",), deluge.common.ftime), "Active Time": (("active_time",), deluge.common.ftime),
"Seeding Time":(("seeding_time",), deluge.common.ftime) "Seeding Time": (("seeding_time",), deluge.common.ftime),
"Complete Seen": (("last_seen_complete",), format_utils.format_date_never),
"Completed": (("completed_time",), format_utils.format_date),
"Seeds:Peers": (("seeds_peers_ratio",), format_utils.format_float),
"Down Limit": (("max_download_speed",), format_utils.format_speed),
"Up Limit": (("max_upload_speed",), format_utils.format_speed),
} }
def get_column_value(name,state): def get_column_value(name,state):

View file

@ -53,6 +53,18 @@ def format_time(time):
else: else:
return "-" return "-"
def format_date(time):
if (time > 0):
return deluge.common.fdate(time)
else:
return ""
def format_date_never(time):
if (time > 0):
return deluge.common.fdate(time)
else:
return "Never"
def format_float(x): def format_float(x):
if x < 0: if x < 0:
return "-" return "-"

View file

@ -475,10 +475,10 @@ class TorrentDetail(BaseMode, component.Component):
s+= " {!info!}Ratio: {!input!}%s" % ratio_str s+= " {!info!}Ratio: {!input!}%s" % ratio_str
self.add_string(off, s); off += 1 self.add_string(off, s); off += 1
#Seeder/leecher info #Seed/peer info
s = "{!info!}Seeders:{!green!} %s {!input!}(%s)" % (status["num_seeds"], status["total_seeds"]) s = "{!info!}Seeds:{!green!} %s {!input!}(%s)" % (status["num_seeds"], status["total_seeds"])
self.add_string(off, s); off += 1 self.add_string(off, s); off += 1
s = "{!info!}Leechers:{!red!} %s {!input!}(%s)" % (status["num_peers"], status["total_peers"]) s = "{!info!}Peers:{!red!} %s {!input!}(%s)" % (status["num_peers"], status["total_peers"])
self.add_string(off, s); off += 1 self.add_string(off, s); off += 1
#Tracker #Tracker

View file

@ -448,8 +448,8 @@ class FilesTab(Tab):
return return
# Store this torrent's compact setting # Store this torrent's compact setting
if status["storage_mode"] == "compact": if "storage_mode" in status:
self.__compact = True self.__compact = status["storage_mode"] == "compact"
if "is_seed" in status: if "is_seed" in status:
self.__is_seed = status["is_seed"] self.__is_seed = status["is_seed"]

View file

@ -134,20 +134,6 @@
<property name="x_options">GTK_FILL</property> <property name="x_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel" id="summary_seed_rank">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="left_attach">7</property>
<property name="right_attach">8</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child> <child>
<object class="GtkLabel" id="summary_seed_time"> <object class="GtkLabel" id="summary_seed_time">
<property name="visible">True</property> <property name="visible">True</property>
@ -162,24 +148,6 @@
<property name="x_options">GTK_FILL</property> <property name="x_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel" id="label20">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Seed Rank:</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="left_attach">6</property>
<property name="right_attach">7</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child> <child>
<object class="GtkLabel" id="label19"> <object class="GtkLabel" id="label19">
<property name="visible">True</property> <property name="visible">True</property>
@ -290,43 +258,6 @@
<property name="y_options">GTK_FILL</property> <property name="y_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel" id="summary_last_seen_complete">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="wrap">True</property>
<property name="wrap_mode">char</property>
<property name="selectable">True</property>
</object>
<packing>
<property name="left_attach">5</property>
<property name="right_attach">8</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_last_seen_complete">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Last Seen Complete:</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="left_attach">4</property>
<property name="right_attach">5</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child> <child>
<object class="GtkLabel" id="summary_availability"> <object class="GtkLabel" id="summary_availability">
<property name="visible">True</property> <property name="visible">True</property>
@ -423,7 +354,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="summary_seeders"> <object class="GtkLabel" id="summary_seeds">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
@ -439,7 +370,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="label" translatable="yes">Seeders:</property> <property name="label" translatable="yes">Seeds:</property>
<attributes> <attributes>
<attribute name="weight" value="bold"/> <attribute name="weight" value="bold"/>
</attributes> </attributes>
@ -726,6 +657,106 @@
<property name="x_options">GTK_FILL</property> <property name="x_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel" id="label20">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Seed Rank:</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="left_attach">4</property>
<property name="right_attach">5</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="summary_seed_rank">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="left_attach">5</property>
<property name="right_attach">6</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_last_seen_complete">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="label" translatable="yes">Complete Seen:</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="left_attach">6</property>
<property name="right_attach">7</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="summary_last_seen_complete">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="wrap">True</property>
<property name="wrap_mode">char</property>
</object>
<packing>
<property name="left_attach">7</property>
<property name="right_attach">8</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_completed">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Completed:</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="left_attach">6</property>
<property name="right_attach">7</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="summary_completed">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="left_attach">7</property>
<property name="right_attach">8</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -1926,9 +1957,6 @@
<property name="y_options">GTK_FILL</property> <property name="y_options">GTK_FILL</property>
</packing> </packing>
</child> </child>
<child>
<placeholder/>
</child>
<child> <child>
<object class="GtkAlignment" id="alignment1"> <object class="GtkAlignment" id="alignment1">
<property name="visible">True</property> <property name="visible">True</property>
@ -1977,6 +2005,9 @@
<property name="bottom_attach">2</property> <property name="bottom_attach">2</property>
</packing> </packing>
</child> </child>
<child>
<placeholder/>
</child>
</object> </object>
<packing> <packing>
<property name="left_attach">2</property> <property name="left_attach">2</property>

View file

@ -64,6 +64,13 @@ def fspeed(value, max_value=-1):
else: else:
return deluge.common.fspeed(value) return deluge.common.fspeed(value)
def fdate(value):
"""Display value as date, eg 05/05/08 or blank"""
if value > 0.0:
return deluge.common.fdate(value)
else:
return ""
def fdate_or_never(value): def fdate_or_never(value):
"""Display value as date, eg 05/05/08 or Never""" """Display value as date, eg 05/05/08 or Never"""
if value > 0.0: if value > 0.0:
@ -95,7 +102,7 @@ class StatusTab(Tab):
(builder.get_object("summary_total_uploaded"), fpeer_sized, ("total_uploaded", "total_payload_upload")), (builder.get_object("summary_total_uploaded"), fpeer_sized, ("total_uploaded", "total_payload_upload")),
(builder.get_object("summary_download_speed"), fspeed, ("download_payload_rate", "max_download_speed")), (builder.get_object("summary_download_speed"), fspeed, ("download_payload_rate", "max_download_speed")),
(builder.get_object("summary_upload_speed"), fspeed, ("upload_payload_rate", "max_upload_speed")), (builder.get_object("summary_upload_speed"), fspeed, ("upload_payload_rate", "max_upload_speed")),
(builder.get_object("summary_seeders"), deluge.common.fpeer, ("num_seeds", "total_seeds")), (builder.get_object("summary_seeds"), deluge.common.fpeer, ("num_seeds", "total_seeds")),
(builder.get_object("summary_peers"), deluge.common.fpeer, ("num_peers", "total_peers")), (builder.get_object("summary_peers"), deluge.common.fpeer, ("num_peers", "total_peers")),
(builder.get_object("summary_eta"), deluge.common.ftime, ("eta",)), (builder.get_object("summary_eta"), deluge.common.ftime, ("eta",)),
(builder.get_object("summary_share_ratio"), fratio, ("ratio",)), (builder.get_object("summary_share_ratio"), fratio, ("ratio",)),
@ -108,6 +115,7 @@ class StatusTab(Tab):
(builder.get_object("progressbar"), fpcnt, ("progress",)), (builder.get_object("progressbar"), fpcnt, ("progress",)),
(builder.get_object("summary_date_added"), deluge.common.fdate, ("time_added",)), (builder.get_object("summary_date_added"), deluge.common.fdate, ("time_added",)),
(builder.get_object("summary_last_seen_complete"), fdate_or_never, ("last_seen_complete",)), (builder.get_object("summary_last_seen_complete"), fdate_or_never, ("last_seen_complete",)),
(builder.get_object("summary_completed"), fdate, ("completed_time",)),
] ]
def update(self): def update(self):
@ -129,7 +137,8 @@ class StatusTab(Tab):
"total_seeds", "eta", "ratio", "next_announce", "total_seeds", "eta", "ratio", "next_announce",
"tracker_status", "max_connections", "max_upload_slots", "tracker_status", "max_connections", "max_upload_slots",
"max_upload_speed", "max_download_speed", "active_time", "max_upload_speed", "max_download_speed", "active_time",
"seeding_time", "seed_rank", "is_auto_managed", "time_added", "last_seen_complete"] "seeding_time", "seed_rank", "is_auto_managed", "time_added",
"last_seen_complete", "completed_time"]
if self.config['show_piecesbar']: if self.config['show_piecesbar']:
status_keys.extend(["pieces", "state"]) status_keys.extend(["pieces", "state"])

View file

@ -271,13 +271,13 @@ class TorrentView(listview.ListView, component.Component):
status_field=["progress", "state"], status_field=["progress", "state"],
col_types=[float, str], col_types=[float, str],
function=funcs.cell_data_progress) function=funcs.cell_data_progress)
self.add_func_column(_("Seeders"), funcs.cell_data_peer, [int, int], self.add_func_column(_("Seeds"), funcs.cell_data_peer, [int, int],
status_field=["num_seeds", "total_seeds"], status_field=["num_seeds", "total_seeds"],
sort_func=seed_peer_column_sort, default=False) sort_func=seed_peer_column_sort, default=False)
self.add_func_column(_("Peers"), funcs.cell_data_peer, [int, int], self.add_func_column(_("Peers"), funcs.cell_data_peer, [int, int],
status_field=["num_peers", "total_peers"], status_field=["num_peers", "total_peers"],
sort_func=seed_peer_column_sort, default=False) sort_func=seed_peer_column_sort, default=False)
self.add_func_column(_("Seeders") + "/" + _("Peers"), funcs.cell_data_ratio_seeders, [float], self.add_func_column(_("Seeds:Peers"), funcs.cell_data_ratio_seeds_peers, [float],
status_field=["seeds_peers_ratio"], default=False) status_field=["seeds_peers_ratio"], default=False)
self.add_func_column(_("Down Speed"), funcs.cell_data_speed_down, [float], self.add_func_column(_("Down Speed"), funcs.cell_data_speed_down, [float],
status_field=["download_payload_rate"]) status_field=["download_payload_rate"])
@ -295,15 +295,12 @@ class TorrentView(listview.ListView, component.Component):
status_field=["distributed_copies"], default=False) status_field=["distributed_copies"], default=False)
self.add_func_column(_("Added"), funcs.cell_data_date, [float], self.add_func_column(_("Added"), funcs.cell_data_date, [float],
status_field=["time_added"], default=False) status_field=["time_added"], default=False)
self.add_func_column(_("Completed"), self.add_func_column(_("Completed"), funcs.cell_data_date, [float],
funcs.cell_data_date_or_never, [float],
status_field=["completed_time"], default=False) status_field=["completed_time"], default=False)
self.add_func_column(_("Last Seen Complete"), self.add_func_column(_("Complete Seen"), funcs.cell_data_date_or_never, [float],
funcs.cell_data_date_or_never, [float],
status_field=["last_seen_complete"], default=False) status_field=["last_seen_complete"], default=False)
self.add_texticon_column(_("Tracker"), self.add_texticon_column(_("Tracker"), function=funcs.cell_data_trackericon,
status_field=["tracker_host", "tracker_host"], status_field=["tracker_host", "tracker_host"], default=False)
function=funcs.cell_data_trackericon, default=False)
self.add_text_column(_("Save Path"), status_field=["save_path"], default=False) self.add_text_column(_("Save Path"), status_field=["save_path"], default=False)
self.add_text_column(_("Owner"), status_field=["owner"], default=False) self.add_text_column(_("Owner"), status_field=["owner"], default=False)
self.restore_columns_order_from_state() self.restore_columns_order_from_state()

View file

@ -84,7 +84,7 @@ def _t(text):
func_last_value = {"cell_data_speed_down": None, func_last_value = {"cell_data_speed_down": None,
"cell_data_speed_up": None, "cell_data_speed_up": None,
"cell_data_time": None, "cell_data_time": None,
"cell_data_ratio_seeders": None, "cell_data_ratio_seeds_peers": None,
"cell_data_ratio_ratio": None, "cell_data_ratio_ratio": None,
"cell_data_ratio_avail": None, "cell_data_ratio_avail": None,
"cell_data_date": None, "cell_data_date": None,
@ -269,8 +269,8 @@ def cell_data_ratio(cell, model, row, data, cache_key):
func_last_value[cache_key] = ratio func_last_value[cache_key] = ratio
cell.set_property('text', "" if ratio < 0 else "%.3f" % ratio) cell.set_property('text', "" if ratio < 0 else "%.3f" % ratio)
def cell_data_ratio_seeders(column, cell, model, row, data): def cell_data_ratio_seeds_peers(column, cell, model, row, data):
cell_data_ratio(cell, model, row, data, "cell_data_ratio_seeders") cell_data_ratio(cell, model, row, data, "cell_data_ratio_seeds_peers")
def cell_data_ratio_ratio(column, cell, model, row, data): def cell_data_ratio_ratio(column, cell, model, row, data):
cell_data_ratio(cell, model, row, data, "cell_data_ratio_ratio") cell_data_ratio(cell, model, row, data, "cell_data_ratio_ratio")
@ -286,7 +286,7 @@ def cell_data_date(column, cell, model, row, data):
return return
func_last_value["cell_data_date"] = date func_last_value["cell_data_date"] = date
date_str = common.fdate(date) date_str = common.fdate(date) if date > 0.0 else ""
cell.set_property('text', date_str) cell.set_property('text', date_str)
def cell_data_date_or_never(column, cell, model, row, data): def cell_data_date_or_never(column, cell, model, row, data):

View file

@ -42,9 +42,9 @@ Deluge.Keys = {
* <pre>['queue', 'name', 'total_size', 'total_wanted', 'state', 'progress', 'num_seeds', * <pre>['queue', 'name', 'total_size', 'total_wanted', 'state', 'progress', 'num_seeds',
* 'total_seeds', 'num_peers', 'total_peers', 'download_payload_rate', * 'total_seeds', 'num_peers', 'total_peers', 'download_payload_rate',
* 'upload_payload_rate', 'eta', 'ratio', 'distributed_copies', * 'upload_payload_rate', 'eta', 'ratio', 'distributed_copies',
* 'is_auto_managed', 'time_added', 'tracker_host', 'save_path', * 'is_auto_managed', 'time_added', 'tracker_host', 'save_path', 'last_seen_complete',
* 'total_done', 'total_uploaded', 'max_download_speed', 'max_upload_speed', * 'total_done', 'total_uploaded', 'max_download_speed', 'max_upload_speed',
* 'seeds_peers_ratio', 'total_remaining']</pre> * 'seeds_peers_ratio', 'total_remaining', 'completed_time']</pre>
*/ */
Grid: [ Grid: [
'queue', 'name', 'total_size', 'total_wanted', 'state', 'progress', 'num_seeds', 'queue', 'name', 'total_size', 'total_wanted', 'state', 'progress', 'num_seeds',
@ -52,7 +52,7 @@ Deluge.Keys = {
'upload_payload_rate', 'eta', 'ratio', 'distributed_copies', 'upload_payload_rate', 'eta', 'ratio', 'distributed_copies',
'is_auto_managed', 'time_added', 'tracker_host', 'save_path', 'last_seen_complete', 'is_auto_managed', 'time_added', 'tracker_host', 'save_path', 'last_seen_complete',
'total_done', 'total_uploaded', 'max_download_speed', 'max_upload_speed', 'total_done', 'total_uploaded', 'max_download_speed', 'max_upload_speed',
'seeds_peers_ratio', 'total_remaining' 'seeds_peers_ratio', 'total_remaining', 'completed_time'
], ],
/** /**
@ -61,13 +61,13 @@ Deluge.Keys = {
* <pre>['total_done', 'total_payload_download', 'total_uploaded', * <pre>['total_done', 'total_payload_download', 'total_uploaded',
* 'total_payload_upload', 'next_announce', 'tracker_status', 'num_pieces', * 'total_payload_upload', 'next_announce', 'tracker_status', 'num_pieces',
* 'piece_length', 'is_auto_managed', 'active_time', 'seeding_time', * 'piece_length', 'is_auto_managed', 'active_time', 'seeding_time',
* 'seed_rank']</pre> * 'seed_rank', 'last_seen_complete', 'completed_time', 'owner', 'public', 'shared']</pre>
*/ */
Status: [ Status: [
'total_done', 'total_payload_download', 'total_uploaded', 'total_done', 'total_payload_download', 'total_uploaded',
'total_payload_upload', 'next_announce', 'tracker_status', 'num_pieces', 'total_payload_upload', 'next_announce', 'tracker_status', 'num_pieces',
'piece_length', 'is_auto_managed', 'active_time', 'seeding_time', 'piece_length', 'is_auto_managed', 'active_time', 'seeding_time',
'seed_rank', 'last_seen_complete', 'owner', 'public', 'shared' 'seed_rank', 'last_seen_complete', 'completed_time', 'owner', 'public', 'shared'
], ],
/** /**

View file

@ -131,7 +131,7 @@
renderer: torrentProgressRenderer, renderer: torrentProgressRenderer,
dataIndex: 'progress' dataIndex: 'progress'
}, { }, {
header: _('Seeders'), header: _('Seeds'),
hidden: true, hidden: true,
width: 60, width: 60,
sortable: true, sortable: true,
@ -184,11 +184,19 @@
renderer: fdate, renderer: fdate,
dataIndex: 'time_added' dataIndex: 'time_added'
}, { }, {
header: _('Last Seen Complete'), header: _('Complete Seen'),
hidden: true,
width: 80, width: 80,
sortable: true, sortable: true,
renderer: dateOrNever, renderer: dateOrNever,
dataIndex: 'last_seen_complete' dataIndex: 'last_seen_complete'
}, {
header: _('Completed'),
hidden: true,
width: 80,
sortable: true,
renderer: dateOrNever,
dataIndex: 'completed_time'
}, { }, {
header: _('Tracker'), header: _('Tracker'),
hidden: true, hidden: true,
@ -259,7 +267,7 @@
renderer: torrentLimitRenderer, renderer: torrentLimitRenderer,
dataIndex: 'max_upload_speed' dataIndex: 'max_upload_speed'
}, { }, {
header: _('Seeders') + '/' + _('Peers'), header: _('Seeds:Peers'),
hidden: true, hidden: true,
width: 75, width: 75,
sortable: true, sortable: true,

View file

@ -91,9 +91,10 @@ Deluge.details.StatusTab = Ext.extend(Ext.Panel, {
}, },
onRequestComplete: function(status) { onRequestComplete: function(status) {
seeders = status.total_seeds > -1 ? status.num_seeds + ' (' + status.total_seeds + ')' : status.num_seeds; seeds = status.total_seeds > -1 ? status.num_seeds + ' (' + status.total_seeds + ')' : status.num_seeds;
peers = status.total_peers > -1 ? status.num_peers + ' (' + status.total_peers + ')' : status.num_peers; peers = status.total_peers > -1 ? status.num_peers + ' (' + status.total_peers + ')' : status.num_peers;
last_seen_complete = status.last_seen_complete > 0.0 ? fdate(status.last_seen_complete) : "Never"; last_seen_complete = status.last_seen_complete > 0.0 ? fdate(status.last_seen_complete) : "Never";
completed_time = status.last_seen_complete > 0.0 ? fdate(status.completed_time) : "Never";
var data = { var data = {
downloaded: fsize(status.total_done, true), downloaded: fsize(status.total_done, true),
uploaded: fsize(status.total_uploaded, true), uploaded: fsize(status.total_uploaded, true),
@ -104,14 +105,15 @@ Deluge.details.StatusTab = Ext.extend(Ext.Panel, {
upspeed: (status.upload_payload_rate) ? fspeed(status.upload_payload_rate) : '0.0 KiB/s', upspeed: (status.upload_payload_rate) ? fspeed(status.upload_payload_rate) : '0.0 KiB/s',
eta: ftime(status.eta), eta: ftime(status.eta),
pieces: status.num_pieces + ' (' + fsize(status.piece_length) + ')', pieces: status.num_pieces + ' (' + fsize(status.piece_length) + ')',
seeders: seeders, seeds: seeds,
peers: peers, peers: peers,
avail: status.distributed_copies.toFixed(3), avail: status.distributed_copies.toFixed(3),
active_time: ftime(status.active_time), active_time: ftime(status.active_time),
seeding_time: ftime(status.seeding_time), seeding_time: ftime(status.seeding_time),
seed_rank: status.seed_rank, seed_rank: status.seed_rank,
time_added: fdate(status.time_added), time_added: fdate(status.time_added),
last_seen_complete: last_seen_complete last_seen_complete: last_seen_complete,
completed_time: completed_time
} }
data.auto_managed = _((status.is_auto_managed) ? 'True' : 'False'); data.auto_managed = _((status.is_auto_managed) ? 'True' : 'False');

View file

@ -1,27 +1,28 @@
<dl> <dl>
<dt class="downloaded">${_("Downloaded")}:</dt><dd class="downloaded"/> <dt class="downloaded">${_("Downloaded:")}</dt><dd class="downloaded"/>
<dt class="uploaded">${_("Uploaded")}:</dt><dd class="uploaded"/> <dt class="uploaded">${_("Uploaded:")}</dt><dd class="uploaded"/>
<dt class="share">${_("Share Ratio")}:</dt><dd class="share"/> <dt class="share">${_("Share Ratio:")}</dt><dd class="share"/>
<dt class="announce">${_("Next Announce")}:</dt><dd class="announce"/> <dt class="announce">${_("Next Announce:")}</dt><dd class="announce"/>
<dt class="tracker">${_("Tracker Status")}:</dt><dd class="tracker_status"/> <dt class="tracker">${_("Tracker Status:")}</dt><dd class="tracker_status"/>
</dl> </dl>
<dl> <dl>
<dt class="downspeed">${_("Speed")}:</dt><dd class="downspeed"/> <dt class="downspeed">${_("Down Speed:")}</dt><dd class="downspeed"/>
<dt class="upspeed">${_("Speed")}:</dt><dd class="upspeed"/> <dt class="upspeed">${_("Up Speed:")}</dt><dd class="upspeed"/>
<dt class="eta">${_("ETA")}:</dt><dd class="eta"/> <dt class="eta">${_("ETA:")}</dt><dd class="eta"/>
<dt class="pieces">${_("Pieces")}:</dt><dd class="pieces"/> <dt class="pieces">${_("Pieces:")}</dt><dd class="pieces"/>
</dl> </dl>
<dl> <dl>
<dt class="seeders">${_("Seeders")}:</dt><dd class="seeders"/> <dt class="seeds">${_("Seeds:")}</dt><dd class="seeds"/>
<dt class="peers">${_("Peers")}:</dt><dd class="peers"/> <dt class="peers">${_("Peers:")}</dt><dd class="peers"/>
<dt class="avail">${_("Availability")}:</dt><dd class="avail"/> <dt class="avail">${_("Availability:")}</dt><dd class="avail"/>
<dt class="auto_managed">${_("Auto Managed")}:</dt><dd class="auto_managed"/> <dt class="auto_managed">${_("Auto Managed:")}</dt><dd class="auto_managed"/>
<dt class="last_seen_complete">${_("Last Seen Complete")}:&nbsp;</dt><dd class="last_seen_complete"/> <dt class="last_seen_complete">${_("Complete Seen:")}</dt><dd class="last_seen_complete"/>
</dl> </dl>
<dl> <dl>
<dt class="active_time">${_("Active Time")}:</dt><dd class="active_time"/> <dt class="active_time">${_("Active Time:")}</dt><dd class="active_time"/>
<dt class="seeding_time">${_("Seeding Time")}:</dt><dd class="seeding_time"/> <dt class="seeding_time">${_("Seeding Time:")}</dt><dd class="seeding_time"/>
<dt class="seed_rank">${_("Seed Rank")}:</dt><dd class="seed_rank"/> <dt class="seed_rank">${_("Seed Rank:")}</dt><dd class="seed_rank"/>
<dt class="time_rank">${_("Date Added")}:</dt><dd class="time_added"/> <dt class="time_rank">${_("Date Added:")}</dt><dd class="time_added"/>
<dt class="completed_time">${_("Completed:")}</dt><dd class="completed_time"/>
</dl> </dl>
<br style="clear: both;" /> <br style="clear: both;" />