Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
85b904f1
Commit
85b904f1
authored
Jun 13, 2013
by
Chris Dodge
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix sizing of the delete column
parent
9b749c42
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
164 additions
and
6 deletions
+164
-6
cms/djangoapps/contentstore/management/commands/empty_asset_trashcan.py
+28
-0
cms/djangoapps/contentstore/management/commands/restore_asset_from_trashcan.py
+17
-0
cms/djangoapps/contentstore/views/assets.py
+13
-3
cms/static/js/base.js
+24
-0
cms/static/sass/views/_assets.scss
+4
-0
cms/templates/asset_index.html
+27
-1
cms/urls.py
+2
-2
common/lib/xmodule/xmodule/contentstore/utils.py
+49
-0
No files found.
cms/djangoapps/contentstore/management/commands/empty_asset_trashcan.py
0 → 100644
View file @
85b904f1
###
### Script for cloning a course
###
from
django.core.management.base
import
BaseCommand
,
CommandError
from
xmodule.course_module
import
CourseDescriptor
from
xmodule.contentstore.utils
import
empty_asset_trashcan
from
xmodule.modulestore.django
import
modulestore
from
.prompt
import
query_yes_no
class
Command
(
BaseCommand
):
help
=
'''Empty the trashcan. Can pass an optional course_id to limit the damage.'''
def
handle
(
self
,
*
args
,
**
options
):
if
len
(
args
)
!=
1
and
len
(
args
)
!=
0
:
raise
CommandError
(
"empty_asset_trashcan requires one or no arguments: |<location>|"
)
locs
=
[]
if
len
(
args
)
==
1
:
locs
.
append
(
CourseDescriptor
.
id_to_location
(
args
[
0
]))
else
:
courses
=
modulestore
(
'direct'
)
.
get_courses
()
for
course
in
courses
:
locs
.
append
(
course
.
location
)
if
query_yes_no
(
"Emptying trashcan. Confirm?"
,
default
=
"no"
):
empty_asset_trashcan
(
locs
)
cms/djangoapps/contentstore/management/commands/restore_asset_from_trashcan.py
0 → 100644
View file @
85b904f1
###
### Script for cloning a course
###
from
django.core.management.base
import
BaseCommand
,
CommandError
from
xmodule.contentstore.utils
import
restore_asset_from_trashcan
from
xmodule.modulestore
import
Location
class
Command
(
BaseCommand
):
help
=
'''Restore a deleted asset from the trashcan back to it's original course'''
def
handle
(
self
,
*
args
,
**
options
):
if
len
(
args
)
!=
1
and
len
(
args
)
!=
0
:
raise
CommandError
(
"restore_asset_from_trashcan requires one argument: <location>"
)
restore_asset_from_trashcan
(
args
[
0
])
cms/djangoapps/contentstore/views/assets.py
View file @
85b904f1
...
...
@@ -80,7 +80,12 @@ def asset_index(request, org, course, name):
'active_tab'
:
'assets'
,
'context_course'
:
course_module
,
'assets'
:
asset_display
,
'upload_asset_callback_url'
:
upload_asset_callback_url
'upload_asset_callback_url'
:
upload_asset_callback_url
,
'remove_asset_callback_url'
:
reverse
(
'remove_asset'
,
kwargs
=
{
'org'
:
org
,
'course'
:
course
,
'name'
:
name
})
})
...
...
@@ -151,16 +156,19 @@ def upload_asset(request, org, course, coursename):
@ensure_csrf_cookie
@login_required
def
remove_asset
(
request
,
org
,
course
,
name
,
location
):
def
remove_asset
(
request
,
org
,
course
,
name
):
'''
This method will perform a 'soft-delete' of an asset, which is basically to copy the asset from
the main GridFS collection and into a Trashcan
'''
get_location_and_verify_access
(
request
,
org
,
course
,
name
)
location
=
request
.
POST
[
'location'
]
logging
.
debug
(
'location = {0}'
.
format
(
location
))
# make sure the location is valid
try
:
loc
=
StaticContent
.
get_location_from_path
(
request
.
path
)
loc
=
StaticContent
.
get_location_from_path
(
location
)
except
InvalidLocationError
:
# return a 'Bad Request' to browser as we have a malformed Location
response
=
HttpResponse
()
...
...
@@ -195,6 +203,8 @@ def remove_asset(request, org, course, name, location):
# remove from cache
del_cached_content
(
content
.
location
)
return
HttpResponse
()
@ensure_csrf_cookie
@login_required
...
...
cms/static/js/base.js
View file @
85b904f1
...
...
@@ -146,6 +146,7 @@ $(document).ready(function() {
$
(
'.edit-section-start-save'
).
bind
(
'click'
,
saveSetSectionScheduleDate
);
$
(
'.upload-modal .choose-file-button'
).
bind
(
'click'
,
showFileSelectionMenu
);
$
(
'.remove-asset-button'
).
bind
(
'click'
,
removeAsset
);
$body
.
on
(
'click'
,
'.section-published-date .edit-button'
,
editSectionPublishDate
);
$body
.
on
(
'click'
,
'.section-published-date .schedule-button'
,
editSectionPublishDate
);
...
...
@@ -398,6 +399,29 @@ function _deleteItem($el) {
});
}
function
removeAsset
(
e
)
{
e
.
preventDefault
();
// replace with new notification moodal
if
(
!
confirm
(
'Are you sure you wish to delete this item. It cannot be reversed!'
))
return
;
var
remove_asset_url
=
$
(
'.asset-library'
).
data
(
'remove-asset-callback-url'
);
var
location
=
$
(
this
).
closest
(
'tr'
).
data
(
'id'
);
var
that
=
this
;
$
.
post
(
remove_asset_url
,
{
'location'
:
location
},
function
()
{
// show the alert
$
(
".wrapper-alert-confirmation"
).
addClass
(
"is-shown"
).
attr
(
'aria-hidden'
,
'false'
);
$
(
that
).
closest
(
'tr'
).
remove
();
analytics
.
track
(
'Deleted Asset'
,
{
'course'
:
course_location_analytics
,
'id'
:
location
});
}
);
}
function
showUploadModal
(
e
)
{
e
.
preventDefault
();
$modal
=
$
(
'.upload-modal'
).
show
();
...
...
cms/static/sass/views/_assets.scss
View file @
85b904f1
...
...
@@ -76,6 +76,10 @@ body.course.uploads {
width
:
250px
;
}
.delete-col
{
width
:
20px
;
}
.embeddable-xml-input
{
@include
box-shadow
(
none
);
width
:
100%
;
...
...
cms/templates/asset_index.html
View file @
85b904f1
<
%
inherit
file=
"base.html"
/>
<
%!
from
django
.
core
.
urlresolvers
import
reverse
%
>
<
%!
from
django
.
utils
.
translation
import
ugettext
as
_
%
>
<
%
block
name=
"bodyclass"
>
is-signedin course uploads
</
%
block>
<
%
block
name=
"title"
>
Files
&
Uploads
</
%
block>
...
...
@@ -30,6 +31,9 @@
<
td
class
=
"embed-col"
>
<
input
type
=
"text"
class
=
"embeddable-xml-input"
value
=
'{{url}}'
readonly
>
<
/td
>
<
td
class
=
"delete-col"
>
<
a
href
=
"#"
data
-
tooltip
=
"${_('Delete this asset')}"
class
=
"remove-asset-button"
><
span
class
=
"delete-icon"
><
/span></
a
>
<
/td
>
<
/tr
>
</script>
...
...
@@ -56,7 +60,7 @@
<div
class=
"page-actions"
>
<input
type=
"text"
class=
"asset-search-input search wip-box"
placeholder=
"search assets"
style=
"display:none"
/>
</div>
<article
class=
"asset-library"
>
<article
class=
"asset-library"
data-remove-asset-callback-url=
'${remove_asset_callback_url}'
>
<table>
<thead>
<tr>
...
...
@@ -64,6 +68,7 @@
<th
class=
"name-col"
>
Name
</th>
<th
class=
"date-col"
>
Date Added
</th>
<th
class=
"embed-col"
>
URL
</th>
<th
class=
"delete-col"
></th>
</tr>
</thead>
<tbody
id=
"asset_table_body"
>
...
...
@@ -86,6 +91,9 @@
<td
class=
"embed-col"
>
<input
type=
"text"
class=
"embeddable-xml-input"
value=
"${asset['url']}"
readonly
>
</td>
<td
class=
"delete-col"
>
<a
href=
"#"
data-tooltip=
"${_('Delete this asset')}"
class=
"remove-asset-button"
><span
class=
"delete-icon"
></span></a>
</td>
</tr>
% endfor
</tbody>
...
...
@@ -129,3 +137,21 @@
</
%
block>
<
%
block
name=
"view_alerts"
>
<!-- alert: save confirmed with close -->
<div
class=
"wrapper wrapper-alert wrapper-alert-confirmation"
role=
"status"
>
<div
class=
"alert confirmation"
>
<i
class=
"icon-ok"
></i>
<div
class=
"copy"
>
<h2
class=
"title title-3"
>
${_('Your file has been deleted.')}
</h2>
</div>
<a
href=
""
rel=
"view"
class=
"action action-alert-close"
>
<i
class=
"icon-remove-sign"
></i>
<span
class=
"label"
>
close alert
</span>
</a>
</div>
</div>
</
%
block>
cms/urls.py
View file @
85b904f1
...
...
@@ -76,8 +76,8 @@ urlpatterns = ('', # nopep8
url
(
r'^(?P<org>[^/]+)/(?P<course>[^/]+)/assets/(?P<name>[^/]+)$'
,
'contentstore.views.asset_index'
,
name
=
'asset_index'
),
url
(
r'^(?P<org>[^/]+)/(?P<course>[^/]+)/assets/
remove/(?P<location>.*?)
$'
,
'contentstore.views.remove_asset'
,
name
=
'remove_asset'
),
url
(
r'^(?P<org>[^/]+)/(?P<course>[^/]+)/assets/
(?P<name>[^/]+)/remove
$'
,
'contentstore.views.
assets.
remove_asset'
,
name
=
'remove_asset'
),
# this is a generic method to return the data/metadata associated with a xmodule
url
(
r'^module_info/(?P<module_location>.*)$'
,
...
...
common/lib/xmodule/xmodule/contentstore/utils.py
0 → 100644
View file @
85b904f1
from
xmodule.modulestore
import
Location
from
xmodule.contentstore.content
import
StaticContent
from
.django
import
contentstore
def
empty_asset_trashcan
(
course_locs
=
None
):
'''
This method will hard delete all assets (optionally within a course_id) from the trashcan
'''
store
=
contentstore
(
'trashcan'
)
for
course_loc
in
course_locs
:
# first delete all of the thumbnails
thumbs
=
store
.
get_all_content_thumbnails_for_course
(
course_loc
)
for
thumb
in
thumbs
:
thumb_loc
=
Location
(
thumb
[
"_id"
])
id
=
StaticContent
.
get_id_from_location
(
thumb_loc
)
print
"Deleting {0}..."
.
format
(
id
)
store
.
delete
(
id
)
# then delete all of the assets
assets
=
store
.
get_all_content_for_course
(
course_loc
)
for
asset
in
assets
:
asset_loc
=
Location
(
asset
[
"_id"
])
id
=
StaticContent
.
get_id_from_location
(
asset_loc
)
print
"Deleting {0}..."
.
format
(
id
)
store
.
delete
(
id
)
def
restore_asset_from_trashcan
(
location
):
'''
This method will restore an asset which got soft deleted and put back in the original course
'''
trash
=
contentstore
(
'trashcan'
)
store
=
contentstore
()
loc
=
StaticContent
.
get_location_from_path
(
location
)
content
=
trash
.
find
(
loc
)
# ok, save the content into the courseware
store
.
save
(
content
)
# see if there is a thumbnail as well, if so move that as well
if
content
.
thumbnail_location
is
not
None
:
try
:
thumbnail_content
=
trash
.
find
(
content
.
thumbnail_location
)
store
.
save
(
thumbnail_content
)
except
:
pass
# OK if this is left dangling
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment