Switched DMU web service to support XML and JSON so can be used by media dashboard aswell

Added dmu.ashx file in old plugin folder to add backwards compatability
This commit is contained in:
Matt@MBP13-PC
2012-08-08 08:37:07 -01:00
parent 872ef1fadc
commit a989ea77ff
5 changed files with 160 additions and 56 deletions

View File

@@ -0,0 +1 @@
<%@ WebHandler Language="C#" CodeBehind="MediaUploader.ashx.cs" Class="umbraco.presentation.umbraco.webservices.MediaUploader" %>

View File

@@ -4,7 +4,7 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls");
(function ($, Base, window, document, undefined) {
var itemMappingOptions = {
'create': function(o) {
'create': function (o) {
var item = ko.mapping.fromJS(o.data);
item.selected = ko.observable(false);
item.toggleSelected = function (itm, e) {
@@ -115,6 +115,14 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls");
items: ko.observableArray([]),
queued: ko.observableArray([])
});
self._viewModel.filtered = ko.computed(function () {
return self._viewModel.items();
return ko.utils.arrayFilter(this.items(), function (item) {
return item.Name().toLowerCase().indexOf(self._viewModel.filterTerm()) > -1 ||
item.Tags().toLowerCase().indexOf(self._viewModel.filterTerm()) > -1;
});
}, self._viewModel);
self._viewModel.selected = ko.computed(function() {
return ko.utils.arrayFilter(this.items(), function(item) {
@@ -301,15 +309,16 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls");
start: function (e, ui) {
// Add dragging class to container
$(".umbFolderBrowser .items").addClass("ui-sortable-dragging");
$(".umbFolderBrowser .items .ui-sortable-helper span").removeAttr("data-bind").text("Moving 1 item");
},
update: function (e, ui) {
update: function (e, ui)
{
// Can't sort when filtered so just return
if (self._viewModel.filterTerm().length > 0)
return;
//var oldIndex = self._viewModel.items.indexOf(self._viewModel.tempItem());
var newIndex = ui.item.index();
//TODO: Don't allow sorting on a filtered view
$(".umbFolderBrowser .items .selected").sort(function (a,b) {
return parseInt($(a).data("order")) > parseInt($(b).data("order")) ? 1 : -1;
}).each(function(idx, itm) {
@@ -327,7 +336,15 @@ Umbraco.Sys.registerNamespace("Umbraco.Controls");
stop: function (e, ui) {
// Remove dragging class from container
$(".umbFolderBrowser .items").removeClass("ui-sortable-dragging");
//TODO: Update on server
if (self._viewModel.filterTerm().length > 0) {
$(this).sortable("cancel");
alert("Can't sort items which have been filtered");
}
else
{
//TODO: Update on server
}
}
});
},

View File

@@ -1,10 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using ClientDependency.Core;
using umbraco.BasePages;
using umbraco.BusinessLogic;
using umbraco.IO;
using umbraco.cms.businesslogic.media;
@@ -113,7 +116,7 @@ namespace Umbraco.Web.UI.Controls
sb.Append("<div class='filter'>Filter: <input type='text' data-bind=\"value: filterTerm, valueUpdate: 'afterkeydown'\" /></div>");
// Create thumbnails container
sb.Append("<ul class='items' data-bind='foreach: items'>" +
sb.Append("<ul class='items' data-bind='foreach: filtered'>" +
"<li data-bind=\"attr: { 'data-id': Id, 'data-order': $index() }, css: { selected: selected() }, event: { mousedown: toggleSelected, contextmenu: toggleSelected }\"><div><span class='img'><img data-bind='attr: { src: ThumbnailUrl }' /></span><span data-bind='text: Name'></span></div></li>" +
"</ul>");
@@ -121,11 +124,21 @@ namespace Umbraco.Web.UI.Controls
Controls.Add(panel);
var user = User.GetCurrent();
var ticket = new FormsAuthenticationTicket(1,
user != null ? user.LoginName : "",
DateTime.Now,
DateTime.Now,
false,
"");
Page.ClientScript.RegisterStartupScript(typeof(FolderBrowser),
"RegisterFolderBrowsers",
string.Format("$(function () {{ $(\".umbFolderBrowser\").folderBrowser({{ umbracoPath : '{0}', basePath : '{1}' }}); }});",
string.Format("$(function () {{ $(\".umbFolderBrowser\").folderBrowser({{ umbracoPath : '{0}', basePath : '{1}', username: '{2}', ticket: '{3}' }}); }});",
IOHelper.ResolveUrl(SystemDirectories.Umbraco),
IOHelper.ResolveUrl(SystemDirectories.Base)),
IOHelper.ResolveUrl(SystemDirectories.Base),
user != null ? user.LoginName : "",
FormsAuthentication.Encrypt(ticket)),
true);
}

View File

@@ -45,19 +45,21 @@ namespace Umbraco.Web.WebServices
var fileUrl = fileProp != null ? fileProp.Value.ToString() : "";
var thumbUrl = ThumbnailProviderManager.Current.GetThumbnailUrl(fileUrl);
data.Add(new
var item = new
{
Id = child.Id,
Path = child.Path,
Name = child.Text,
Tags = string.Join(",", Tag.GetTags(child.Id).Select(x => x.TagCaption)),
MediaTypeAlias = child.ContentType.Alias,
EditUrl = string.Format("editMedia.aspx?id={0}", child.Id),
FileUrl = fileUrl,
ThumbnailUrl = !string.IsNullOrEmpty(thumbUrl)
? thumbUrl
ThumbnailUrl = !string.IsNullOrEmpty(thumbUrl)
? thumbUrl
: IOHelper.ResolveUrl(SystemDirectories.Umbraco + "/images/thumbnails/" + child.ContentType.Thumbnail)
});
};
data.Add(item);
}
return new JavaScriptSerializer().Serialize(data);

View File

@@ -6,8 +6,10 @@ using System.Linq;
using System.Text;
using System.Web;
using System.Web.Configuration;
using System.Web.Script.Serialization;
using System.Web.Security;
using System.Xml;
using System.Xml.Serialization;
using umbraco.BusinessLogic;
using umbraco.businesslogic.Exceptions;
using umbraco.cms.businesslogic.media;
@@ -25,75 +27,100 @@ namespace umbraco.presentation.umbraco.webservices
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
context.Response.ContentType = @"text\xml";
context.Response.Charset = "UTF-8";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetAllowResponseInBrowserHistory(true);
MediaResponse response = null;
var xmlTextWriter = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8);
xmlTextWriter.WriteStartDocument();
xmlTextWriter.WriteStartElement("response");
var action = context.Request["action"];
string action = context.Request["action"];
if (IsValidRequest(context, xmlTextWriter) && !string.IsNullOrEmpty(action))
if (IsValidRequest(context) && !string.IsNullOrEmpty(action))
{
switch (action.ToLower())
{
case "config":
ProcessConfigRequest(context, xmlTextWriter);
response = ProcessConfigRequest(context);
break;
case "folderlist":
ProcessFolderListRequest(context, xmlTextWriter);
response = ProcessFolderListRequest(context);
break;
case "upload":
ProcessUploadRequest(context, xmlTextWriter);
response = ProcessUploadRequest(context);
break;
}
}
xmlTextWriter.WriteEndElement();
xmlTextWriter.WriteEndDocument();
xmlTextWriter.Flush();
xmlTextWriter.Close();
// Set success flag
if (response != null)
response.success = true;
else
response = new MediaResponse { success = false };
context.Response.Clear();
context.Response.Charset = "UTF-8";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetAllowResponseInBrowserHistory(true);
var format = context.Request["format"];
switch (format)
{
case "json":
// Format as JSON
context.Response.ContentType = @"application/json";
context.Response.Write(new JavaScriptSerializer().Serialize(response));
break;
default:
// Format as XML
context.Response.ContentType = @"text/xml";
var serializer = new XmlSerializer(response.GetType());
serializer.Serialize(context.Response.OutputStream, response);
break;
}
context.Response.End();
}
public void ProcessConfigRequest(HttpContext context, XmlTextWriter xmlTextWriter)
public ConfigResponse ProcessConfigRequest(HttpContext context)
{
xmlTextWriter.WriteElementString("displayName", new User(context.Request["username"]).Name);
xmlTextWriter.WriteElementString("umbracoPath", VirtualPathUtility.ToAbsolute(GlobalSettings.Path));
xmlTextWriter.WriteElementString("maxRequestLength", GetMaxRequestLength().ToString());
return new ConfigResponse
{
displayName = new User(context.Request["username"]).Name,
umbracoPath = VirtualPathUtility.ToAbsolute(GlobalSettings.Path),
maxRequestLength = GetMaxRequestLength()
};
}
public void ProcessFolderListRequest(HttpContext context, XmlTextWriter xmlTextWriter)
public FolderListResponse ProcessFolderListRequest(HttpContext context)
{
xmlTextWriter.WriteStartElement("folder");
var response = new FolderListResponse
{
folder = new FolderListItem()
};
var startMediaId = AuthenticatedUser.StartMediaId;
if (startMediaId < 1)
{
xmlTextWriter.WriteAttributeString("id", "-1");
xmlTextWriter.WriteAttributeString("name", "Media");
response.folder.id = -1;
response.folder.name = "Media";
CreateMediaTree(Media.GetRootMedias(), xmlTextWriter);
CreateMediaTree(Media.GetRootMedias(), response.folder);
}
else
{
var root = new Media(startMediaId);
xmlTextWriter.WriteAttributeString("id", root.Id.ToString());
xmlTextWriter.WriteAttributeString("name", root.Text);
response.folder.id = root.Id;
response.folder.name = root.Text;
CreateMediaTree(root.Children, xmlTextWriter);
CreateMediaTree(root.Children, response.folder);
}
xmlTextWriter.WriteEndElement();
return response;
}
public void ProcessUploadRequest(HttpContext context, XmlTextWriter xmlTextWriter)
public UploadResponse ProcessUploadRequest(HttpContext context)
{
int parentNodeId;
if (int.TryParse(context.Request["parentNodeId"], out parentNodeId) && context.Request.Files.Count > 0)
@@ -158,11 +185,13 @@ namespace umbraco.presentation.umbraco.webservices
// log error
Log.Add(LogTypes.Error, -1, "Parent node id is in incorrect format");
}
return new UploadResponse();
}
#region Helper Methods
private bool IsValidRequest(HttpContext context, XmlTextWriter xmlTextWriter)
private bool IsValidRequest(HttpContext context)
{
// check for secure connection
if (GlobalSettings.UseSSL && !context.Request.IsSecureConnection)
@@ -196,25 +225,25 @@ namespace umbraco.presentation.umbraco.webservices
AuthenticatedUser = user;
}
xmlTextWriter.WriteAttributeString("success", isValid.ToString().ToLower());
return isValid;
}
private void CreateMediaTree(IEnumerable<Media> nodes, XmlWriter xmlTextWriter)
private void CreateMediaTree(IEnumerable<Media> nodes, FolderListItem folder)
{
foreach (var media in nodes.Where(media => media != null && media.ContentType != null && media.ContentType.Alias == "Folder"))
{
xmlTextWriter.WriteStartElement("folder");
xmlTextWriter.WriteAttributeString("id", media.Id.ToString());
xmlTextWriter.WriteAttributeString("name", media.Text);
var subFolder = new FolderListItem
{
id = media.Id,
name = media.Text
};
if (media.HasChildren)
{
CreateMediaTree(media.Children, xmlTextWriter);
CreateMediaTree(media.Children, subFolder);
}
xmlTextWriter.WriteEndElement();
folder.folders.Add(subFolder);
}
}
@@ -266,4 +295,46 @@ namespace umbraco.presentation.umbraco.webservices
#endregion
}
public class MediaResponse
{
[XmlAttribute]
public bool success { get; set; }
}
[XmlRoot("response")]
public class ConfigResponse : MediaResponse
{
public string displayName { get; set; }
public string umbracoPath { get; set; }
public int maxRequestLength { get; set; }
}
[XmlRoot("response")]
public class FolderListResponse : MediaResponse
{
public FolderListItem folder { get; set; }
}
[XmlType("folder")]
public class FolderListItem
{
[XmlAttribute]
public int id { get; set; }
[XmlAttribute]
public string name { get; set; }
[XmlElement("folder")]
public List<FolderListItem> folders { get; set; }
public FolderListItem()
{
folders = new List<FolderListItem>();
}
}
[XmlRoot("response")]
public class UploadResponse : MediaResponse
{ }
}