Merge soutade.fr:dynastie
This commit is contained in:
commit
efff6d8a47
2
forms.py
2
forms.py
|
@ -27,7 +27,7 @@ class CategoryForm(ModelForm):
|
|||
class UserForm(ModelForm):
|
||||
class Meta:
|
||||
model = User
|
||||
exclude = ('is_staff', 'is_active', 'last_login', 'last_joined', 'user_permissions', 'groups', 'date_joined')
|
||||
exclude = ('is_staff', 'is_active', 'last_login', 'last_joined', 'user_permissions', 'groups', 'date_joined', 'password')
|
||||
|
||||
class CommentForm(ModelForm):
|
||||
class Meta:
|
||||
|
|
|
@ -145,6 +145,8 @@ class Post(Index):
|
|||
'replace' : self.createReplace,
|
||||
'tags' : self.createTags}
|
||||
|
||||
self.blog = blog
|
||||
|
||||
if not os.path.exists(src + '/_post.html'):
|
||||
self.addError('No _post.html found, exiting')
|
||||
return self.report
|
||||
|
|
|
@ -178,8 +178,6 @@ class Category(models.Model):
|
|||
super(Category, self).save()
|
||||
|
||||
def remove(self, blog):
|
||||
blog.create_paths()
|
||||
|
||||
output = blog.output_path + '/category/' + self.name_slug
|
||||
if os.path.exists(output):
|
||||
shutil.rmtree(output)
|
||||
|
@ -195,8 +193,6 @@ class Tag(models.Model):
|
|||
super(Tag, self).save()
|
||||
|
||||
def remove(self, blog):
|
||||
blog.create_paths()
|
||||
|
||||
output = blog.output_path + '/tag/' + self.name_slug
|
||||
if os.path.exists(output):
|
||||
shutil.rmtree(output)
|
||||
|
@ -228,7 +224,6 @@ class Post(models.Model):
|
|||
|
||||
def createPost(self, content, tags):
|
||||
b = self.blog
|
||||
b.create_paths()
|
||||
output = b.src_path
|
||||
if not os.path.exists(output + '/_post'):
|
||||
os.mkdir(output + '/_post')
|
||||
|
@ -312,7 +307,6 @@ class Post(models.Model):
|
|||
|
||||
def remove(self):
|
||||
b = self.blog
|
||||
b.create_paths()
|
||||
|
||||
output = b.src_path
|
||||
filename = output + '/_post/' + str(self.pk)
|
||||
|
|
20
search.py
20
search.py
|
@ -109,7 +109,7 @@ class Search:
|
|||
if not word in hashtable:
|
||||
hashtable[word] = []
|
||||
if not index in hashtable[word]:
|
||||
hashtable[word].append([index, word_weight])
|
||||
hashtable[word].insert(0, [index, word_weight])
|
||||
else:
|
||||
weight = hashtable[word][1]
|
||||
hashtable[word][1] = weight + word_weight
|
||||
|
@ -192,16 +192,16 @@ class Search:
|
|||
if len(word) < Search.MINIMUM_LETTERS:
|
||||
continue
|
||||
word = word.lower()
|
||||
while not word in hashtable and len(word) > Search.MINIMUM_LETTERS:
|
||||
word = word[:-1]
|
||||
if word not in hashtable:
|
||||
continue
|
||||
for post in hashtable[word]:
|
||||
if not post[0] in res:
|
||||
res[post[0]] = post[1]
|
||||
res[post[0]] += post[1]
|
||||
sorted_res = sorted(res.iteritems(), key=operator.itemgetter(1))
|
||||
reg = re.compile('.*' + word + '.*')
|
||||
for key in hashtable.keys():
|
||||
if reg.match(key):
|
||||
for post in hashtable[key]:
|
||||
if not post[0] in res:
|
||||
res[post[0]] = post[1]
|
||||
else:
|
||||
res[post[0]] += post[1]
|
||||
|
||||
sorted_res = sorted(res.iteritems(), key=operator.itemgetter(1))
|
||||
sorted_res.reverse()
|
||||
|
||||
res = []
|
||||
|
|
|
@ -14,14 +14,14 @@
|
|||
<div class="comment_header">#<dyn:comment_index/> De<dyn:comment_author/>, le<dyn:comment_date/></div>
|
||||
<dyn:comment_content/>
|
||||
<dyn:replace div_name="a" href="javascript:void(0);" onClick="javascript:display('response_dyn:comment_index');">Répondre</dyn:replace><br/>
|
||||
<dyn:replace div_name="form" id="response_dyn:comment_index" class="response" method="POST" action="http://localhost:8000/comment/add/dyn:post_id/dyn:comment_id" onsubmit="return validateComment(response_dyn:comment_index');">
|
||||
<dyn:replace div_name="form" id="response_dyn:comment_index" class="response" method="POST" action="http://localhost:8000/comment/add/dyn:post_id/dyn:comment_id" onsubmit="return validateComment('response_dyn:comment_index');">
|
||||
Auteur :<br/><input type="text" name="author"/><br/><br/>
|
||||
e-mail* :<br/><input type="text" name="email"/><br/><br/>
|
||||
Le commentaire :<br/><textarea name="the_comment" cols="80" rows="10"> </textarea><br/><br/>
|
||||
<input type="submit" value="Commenter"/>
|
||||
</dyn:replace>
|
||||
</dyn:comments>
|
||||
<dyn:replace div_name="form" id="response_0" method="POST" action="/comment/add/dyn:post_id/0" onsubmit="return validateComment(response_0');">
|
||||
<dyn:replace div_name="form" id="response_0" method="POST" action="/comment/add/dyn:post_id/0" onsubmit="return validateComment('response_0');">
|
||||
Auteur :<br/><input type="text" name="author"/><br/><br/>
|
||||
e-mail* :<br/><input id="email" type="text" name="email"/><input type="text" name="mel"/><br/><br/>
|
||||
Le commentaire :<br/><textarea name="the_comment" cols="80" rows="10"> </textarea><br/><br/>
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
.edited
|
||||
{
|
||||
color:green;
|
||||
font-weight:bold;
|
||||
}
|
|
@ -1,142 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Base64 encode / decode
|
||||
* http://www.webtoolkit.info/
|
||||
*
|
||||
**/
|
||||
|
||||
var Base64 = {
|
||||
|
||||
// private property
|
||||
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
|
||||
|
||||
// public method for encoding
|
||||
encode : function (input) {
|
||||
var output = "";
|
||||
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
|
||||
var i = 0;
|
||||
|
||||
input = Base64._utf8_encode(input);
|
||||
|
||||
while (i < input.length) {
|
||||
|
||||
chr1 = input.charCodeAt(i++);
|
||||
chr2 = input.charCodeAt(i++);
|
||||
chr3 = input.charCodeAt(i++);
|
||||
|
||||
enc1 = chr1 >> 2;
|
||||
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
|
||||
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
||||
enc4 = chr3 & 63;
|
||||
|
||||
if (isNaN(chr2)) {
|
||||
enc3 = enc4 = 64;
|
||||
} else if (isNaN(chr3)) {
|
||||
enc4 = 64;
|
||||
}
|
||||
|
||||
output = output +
|
||||
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
|
||||
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
|
||||
|
||||
}
|
||||
|
||||
return output;
|
||||
},
|
||||
|
||||
// public method for decoding
|
||||
decode : function (input) {
|
||||
var output = "";
|
||||
var chr1, chr2, chr3;
|
||||
var enc1, enc2, enc3, enc4;
|
||||
var i = 0;
|
||||
|
||||
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
||||
|
||||
while (i < input.length) {
|
||||
|
||||
enc1 = this._keyStr.indexOf(input.charAt(i++));
|
||||
enc2 = this._keyStr.indexOf(input.charAt(i++));
|
||||
enc3 = this._keyStr.indexOf(input.charAt(i++));
|
||||
enc4 = this._keyStr.indexOf(input.charAt(i++));
|
||||
|
||||
chr1 = (enc1 << 2) | (enc2 >> 4);
|
||||
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
||||
chr3 = ((enc3 & 3) << 6) | enc4;
|
||||
|
||||
output = output + String.fromCharCode(chr1);
|
||||
|
||||
if (enc3 != 64) {
|
||||
output = output + String.fromCharCode(chr2);
|
||||
}
|
||||
if (enc4 != 64) {
|
||||
output = output + String.fromCharCode(chr3);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
output = Base64._utf8_decode(output);
|
||||
|
||||
return output;
|
||||
|
||||
},
|
||||
|
||||
// private method for UTF-8 encoding
|
||||
_utf8_encode : function (string) {
|
||||
string = string.replace(/\r\n/g,"\n");
|
||||
var utftext = "";
|
||||
|
||||
for (var n = 0; n < string.length; n++) {
|
||||
|
||||
var c = string.charCodeAt(n);
|
||||
|
||||
if (c < 128) {
|
||||
utftext += String.fromCharCode(c);
|
||||
}
|
||||
else if((c > 127) && (c < 2048)) {
|
||||
utftext += String.fromCharCode((c >> 6) | 192);
|
||||
utftext += String.fromCharCode((c & 63) | 128);
|
||||
}
|
||||
else {
|
||||
utftext += String.fromCharCode((c >> 12) | 224);
|
||||
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
|
||||
utftext += String.fromCharCode((c & 63) | 128);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return utftext;
|
||||
},
|
||||
|
||||
// private method for UTF-8 decoding
|
||||
_utf8_decode : function (utftext) {
|
||||
var string = "";
|
||||
var i = 0;
|
||||
var c = c1 = c2 = 0;
|
||||
|
||||
while ( i < utftext.length ) {
|
||||
|
||||
c = utftext.charCodeAt(i);
|
||||
|
||||
if (c < 128) {
|
||||
string += String.fromCharCode(c);
|
||||
i++;
|
||||
}
|
||||
else if((c > 191) && (c < 224)) {
|
||||
c2 = utftext.charCodeAt(i+1);
|
||||
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
|
||||
i += 2;
|
||||
}
|
||||
else {
|
||||
c2 = utftext.charCodeAt(i+1);
|
||||
c3 = utftext.charCodeAt(i+2);
|
||||
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
|
||||
i += 3;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,217 +0,0 @@
|
|||
/*
|
||||
* jsaes version 0.1 - Copyright 2006 B. Poettering
|
||||
*
|
||||
* This program 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 2 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, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*/
|
||||
|
||||
/*
|
||||
* http://point-at-infinity.org/jsaes/
|
||||
*
|
||||
* This is a javascript implementation of the AES block cipher. Key lengths
|
||||
* of 128, 192 and 256 bits are supported.
|
||||
*
|
||||
* The well-functioning of the encryption/decryption routines has been
|
||||
* verified for different key lengths with the test vectors given in
|
||||
* FIPS-197, Appendix C.
|
||||
*
|
||||
* The following code example enciphers the plaintext block '00 11 22 .. EE FF'
|
||||
* with the 256 bit key '00 01 02 .. 1E 1F'.
|
||||
*
|
||||
* AES_Init();
|
||||
*
|
||||
* var block = new Array(16);
|
||||
* for(var i = 0; i < 16; i++)
|
||||
* block[i] = 0x11 * i;
|
||||
*
|
||||
* var key = new Array(32);
|
||||
* for(var i = 0; i < 32; i++)
|
||||
* key[i] = i;
|
||||
*
|
||||
* AES_ExpandKey(key);
|
||||
* AES_Encrypt(block, key);
|
||||
*
|
||||
* AES_Done();
|
||||
*
|
||||
* Report bugs to: jsaes AT point-at-infinity.org
|
||||
*
|
||||
*/
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/*
|
||||
AES_Init: initialize the tables needed at runtime. Call this function
|
||||
before the (first) key expansion.
|
||||
*/
|
||||
|
||||
function AES_Init() {
|
||||
AES_Sbox_Inv = new Array(256);
|
||||
for(var i = 0; i < 256; i++)
|
||||
AES_Sbox_Inv[AES_Sbox[i]] = i;
|
||||
|
||||
AES_ShiftRowTab_Inv = new Array(16);
|
||||
for(var i = 0; i < 16; i++)
|
||||
AES_ShiftRowTab_Inv[AES_ShiftRowTab[i]] = i;
|
||||
|
||||
AES_xtime = new Array(256);
|
||||
for(var i = 0; i < 128; i++) {
|
||||
AES_xtime[i] = i << 1;
|
||||
AES_xtime[128 + i] = (i << 1) ^ 0x1b;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
AES_Done: release memory reserved by AES_Init. Call this function after
|
||||
the last encryption/decryption operation.
|
||||
*/
|
||||
|
||||
function AES_Done() {
|
||||
delete AES_Sbox_Inv;
|
||||
delete AES_ShiftRowTab_Inv;
|
||||
delete AES_xtime;
|
||||
}
|
||||
|
||||
/*
|
||||
AES_ExpandKey: expand a cipher key. Depending on the desired encryption
|
||||
strength of 128, 192 or 256 bits 'key' has to be a byte array of length
|
||||
16, 24 or 32, respectively. The key expansion is done "in place", meaning
|
||||
that the array 'key' is modified.
|
||||
*/
|
||||
|
||||
function AES_ExpandKey(key) {
|
||||
var kl = key.length, ks, Rcon = 1;
|
||||
switch (kl) {
|
||||
case 16: ks = 16 * (10 + 1); break;
|
||||
case 24: ks = 16 * (12 + 1); break;
|
||||
case 32: ks = 16 * (14 + 1); break;
|
||||
default:
|
||||
alert("AES_ExpandKey: Only key lengths of 16, 24 or 32 bytes allowed!");
|
||||
}
|
||||
for(var i = kl; i < ks; i += 4) {
|
||||
var temp = key.slice(i - 4, i);
|
||||
if (i % kl == 0) {
|
||||
temp = new Array(AES_Sbox[temp[1]] ^ Rcon, AES_Sbox[temp[2]],
|
||||
AES_Sbox[temp[3]], AES_Sbox[temp[0]]);
|
||||
if ((Rcon <<= 1) >= 256)
|
||||
Rcon ^= 0x11b;
|
||||
}
|
||||
else if ((kl > 24) && (i % kl == 16))
|
||||
temp = new Array(AES_Sbox[temp[0]], AES_Sbox[temp[1]],
|
||||
AES_Sbox[temp[2]], AES_Sbox[temp[3]]);
|
||||
for(var j = 0; j < 4; j++)
|
||||
key[i + j] = key[i + j - kl] ^ temp[j];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
AES_Encrypt: encrypt the 16 byte array 'block' with the previously
|
||||
expanded key 'key'.
|
||||
*/
|
||||
|
||||
function AES_Encrypt(block, key) {
|
||||
var l = key.length;
|
||||
AES_AddRoundKey(block, key.slice(0, 16));
|
||||
for(var i = 16; i < l - 16; i += 16) {
|
||||
AES_SubBytes(block, AES_Sbox);
|
||||
AES_ShiftRows(block, AES_ShiftRowTab);
|
||||
AES_MixColumns(block);
|
||||
AES_AddRoundKey(block, key.slice(i, i + 16));
|
||||
}
|
||||
AES_SubBytes(block, AES_Sbox);
|
||||
AES_ShiftRows(block, AES_ShiftRowTab);
|
||||
AES_AddRoundKey(block, key.slice(i, l));
|
||||
}
|
||||
|
||||
/*
|
||||
AES_Decrypt: decrypt the 16 byte array 'block' with the previously
|
||||
expanded key 'key'.
|
||||
*/
|
||||
|
||||
function AES_Decrypt(block, key) {
|
||||
var l = key.length;
|
||||
AES_AddRoundKey(block, key.slice(l - 16, l));
|
||||
AES_ShiftRows(block, AES_ShiftRowTab_Inv);
|
||||
AES_SubBytes(block, AES_Sbox_Inv);
|
||||
for(var i = l - 32; i >= 16; i -= 16) {
|
||||
AES_AddRoundKey(block, key.slice(i, i + 16));
|
||||
AES_MixColumns_Inv(block);
|
||||
AES_ShiftRows(block, AES_ShiftRowTab_Inv);
|
||||
AES_SubBytes(block, AES_Sbox_Inv);
|
||||
}
|
||||
AES_AddRoundKey(block, key.slice(0, 16));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* The following lookup tables and functions are for internal use only! */
|
||||
|
||||
AES_Sbox = new Array(99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,
|
||||
118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,
|
||||
147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,
|
||||
7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,
|
||||
47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,
|
||||
251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,
|
||||
188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,
|
||||
100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,
|
||||
50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,
|
||||
78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,
|
||||
116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,
|
||||
158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,
|
||||
137,13,191,230,66,104,65,153,45,15,176,84,187,22);
|
||||
|
||||
AES_ShiftRowTab = new Array(0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11);
|
||||
|
||||
function AES_SubBytes(state, sbox) {
|
||||
for(var i = 0; i < 16; i++)
|
||||
state[i] = sbox[state[i]];
|
||||
}
|
||||
|
||||
function AES_AddRoundKey(state, rkey) {
|
||||
for(var i = 0; i < 16; i++)
|
||||
state[i] ^= rkey[i];
|
||||
}
|
||||
|
||||
function AES_ShiftRows(state, shifttab) {
|
||||
var h = new Array().concat(state);
|
||||
for(var i = 0; i < 16; i++)
|
||||
state[i] = h[shifttab[i]];
|
||||
}
|
||||
|
||||
function AES_MixColumns(state) {
|
||||
for(var i = 0; i < 16; i += 4) {
|
||||
var s0 = state[i + 0], s1 = state[i + 1];
|
||||
var s2 = state[i + 2], s3 = state[i + 3];
|
||||
var h = s0 ^ s1 ^ s2 ^ s3;
|
||||
state[i + 0] ^= h ^ AES_xtime[s0 ^ s1];
|
||||
state[i + 1] ^= h ^ AES_xtime[s1 ^ s2];
|
||||
state[i + 2] ^= h ^ AES_xtime[s2 ^ s3];
|
||||
state[i + 3] ^= h ^ AES_xtime[s3 ^ s0];
|
||||
}
|
||||
}
|
||||
|
||||
function AES_MixColumns_Inv(state) {
|
||||
for(var i = 0; i < 16; i += 4) {
|
||||
var s0 = state[i + 0], s1 = state[i + 1];
|
||||
var s2 = state[i + 2], s3 = state[i + 3];
|
||||
var h = s0 ^ s1 ^ s2 ^ s3;
|
||||
var xh = AES_xtime[h];
|
||||
var h1 = AES_xtime[AES_xtime[xh ^ s0 ^ s2]] ^ h;
|
||||
var h2 = AES_xtime[AES_xtime[xh ^ s1 ^ s3]] ^ h;
|
||||
state[i + 0] ^= h1 ^ AES_xtime[s0 ^ s1];
|
||||
state[i + 1] ^= h2 ^ AES_xtime[s1 ^ s2];
|
||||
state[i + 2] ^= h1 ^ AES_xtime[s2 ^ s3];
|
||||
state[i + 3] ^= h2 ^ AES_xtime[s3 ^ s0];
|
||||
}
|
||||
}
|
|
@ -1,174 +0,0 @@
|
|||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
/* SHA-256 implementation in JavaScript | (c) Chris Veness 2002-2010 | www.movable-type.co.uk */
|
||||
/* - see http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html */
|
||||
/* http://csrc.nist.gov/groups/ST/toolkit/examples.html */
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
var Sha256 = {}; // Sha256 namespace
|
||||
|
||||
/**
|
||||
* Generates SHA-256 hash of string
|
||||
*
|
||||
* @param {String} msg String to be hashed
|
||||
* @param {Boolean} [utf8encode=true] Encode msg as UTF-8 before generating hash
|
||||
* @returns {String} Hash of msg as hex character string
|
||||
*/
|
||||
Sha256.hash = function(msg, utf8encode) {
|
||||
utf8encode = (typeof utf8encode == 'undefined') ? true : utf8encode;
|
||||
|
||||
// convert string to UTF-8, as SHA only deals with byte-streams
|
||||
if (utf8encode) msg = Utf8.encode(msg);
|
||||
|
||||
// constants [§4.2.2]
|
||||
var K = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
||||
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
||||
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
||||
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
||||
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
||||
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
||||
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
||||
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
|
||||
// initial hash value [§5.3.1]
|
||||
var H = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];
|
||||
|
||||
// PREPROCESSING
|
||||
|
||||
msg += String.fromCharCode(0x80); // add trailing '1' bit (+ 0's padding) to string [§5.1.1]
|
||||
|
||||
// convert string msg into 512-bit/16-integer blocks arrays of ints [§5.2.1]
|
||||
var l = msg.length/4 + 2; // length (in 32-bit integers) of msg + ‘1’ + appended length
|
||||
var N = Math.ceil(l/16); // number of 16-integer-blocks required to hold 'l' ints
|
||||
var M = new Array(N);
|
||||
|
||||
for (var i=0; i<N; i++) {
|
||||
M[i] = new Array(16);
|
||||
for (var j=0; j<16; j++) { // encode 4 chars per integer, big-endian encoding
|
||||
M[i][j] = (msg.charCodeAt(i*64+j*4)<<24) | (msg.charCodeAt(i*64+j*4+1)<<16) |
|
||||
(msg.charCodeAt(i*64+j*4+2)<<8) | (msg.charCodeAt(i*64+j*4+3));
|
||||
} // note running off the end of msg is ok 'cos bitwise ops on NaN return 0
|
||||
}
|
||||
// add length (in bits) into final pair of 32-bit integers (big-endian) [§5.1.1]
|
||||
// note: most significant word would be (len-1)*8 >>> 32, but since JS converts
|
||||
// bitwise-op args to 32 bits, we need to simulate this by arithmetic operators
|
||||
M[N-1][14] = ((msg.length-1)*8) / Math.pow(2, 32); M[N-1][14] = Math.floor(M[N-1][14])
|
||||
M[N-1][15] = ((msg.length-1)*8) & 0xffffffff;
|
||||
|
||||
|
||||
// HASH COMPUTATION [§6.1.2]
|
||||
|
||||
var W = new Array(64); var a, b, c, d, e, f, g, h;
|
||||
for (var i=0; i<N; i++) {
|
||||
|
||||
// 1 - prepare message schedule 'W'
|
||||
for (var t=0; t<16; t++) W[t] = M[i][t];
|
||||
for (var t=16; t<64; t++) W[t] = (Sha256.sigma1(W[t-2]) + W[t-7] + Sha256.sigma0(W[t-15]) + W[t-16]) & 0xffffffff;
|
||||
|
||||
// 2 - initialise working variables a, b, c, d, e, f, g, h with previous hash value
|
||||
a = H[0]; b = H[1]; c = H[2]; d = H[3]; e = H[4]; f = H[5]; g = H[6]; h = H[7];
|
||||
|
||||
// 3 - main loop (note 'addition modulo 2^32')
|
||||
for (var t=0; t<64; t++) {
|
||||
var T1 = h + Sha256.Sigma1(e) + Sha256.Ch(e, f, g) + K[t] + W[t];
|
||||
var T2 = Sha256.Sigma0(a) + Sha256.Maj(a, b, c);
|
||||
h = g;
|
||||
g = f;
|
||||
f = e;
|
||||
e = (d + T1) & 0xffffffff;
|
||||
d = c;
|
||||
c = b;
|
||||
b = a;
|
||||
a = (T1 + T2) & 0xffffffff;
|
||||
}
|
||||
// 4 - compute the new intermediate hash value (note 'addition modulo 2^32')
|
||||
H[0] = (H[0]+a) & 0xffffffff;
|
||||
H[1] = (H[1]+b) & 0xffffffff;
|
||||
H[2] = (H[2]+c) & 0xffffffff;
|
||||
H[3] = (H[3]+d) & 0xffffffff;
|
||||
H[4] = (H[4]+e) & 0xffffffff;
|
||||
H[5] = (H[5]+f) & 0xffffffff;
|
||||
H[6] = (H[6]+g) & 0xffffffff;
|
||||
H[7] = (H[7]+h) & 0xffffffff;
|
||||
}
|
||||
|
||||
return Sha256.toHexStr(H[0]) + Sha256.toHexStr(H[1]) + Sha256.toHexStr(H[2]) + Sha256.toHexStr(H[3]) +
|
||||
Sha256.toHexStr(H[4]) + Sha256.toHexStr(H[5]) + Sha256.toHexStr(H[6]) + Sha256.toHexStr(H[7]);
|
||||
}
|
||||
|
||||
Sha256.ROTR = function(n, x) { return (x >>> n) | (x << (32-n)); }
|
||||
Sha256.Sigma0 = function(x) { return Sha256.ROTR(2, x) ^ Sha256.ROTR(13, x) ^ Sha256.ROTR(22, x); }
|
||||
Sha256.Sigma1 = function(x) { return Sha256.ROTR(6, x) ^ Sha256.ROTR(11, x) ^ Sha256.ROTR(25, x); }
|
||||
Sha256.sigma0 = function(x) { return Sha256.ROTR(7, x) ^ Sha256.ROTR(18, x) ^ (x>>>3); }
|
||||
Sha256.sigma1 = function(x) { return Sha256.ROTR(17, x) ^ Sha256.ROTR(19, x) ^ (x>>>10); }
|
||||
Sha256.Ch = function(x, y, z) { return (x & y) ^ (~x & z); }
|
||||
Sha256.Maj = function(x, y, z) { return (x & y) ^ (x & z) ^ (y & z); }
|
||||
|
||||
//
|
||||
// hexadecimal representation of a number
|
||||
// (note toString(16) is implementation-dependant, and
|
||||
// in IE returns signed numbers when used on full words)
|
||||
//
|
||||
Sha256.toHexStr = function(n) {
|
||||
var s="", v;
|
||||
for (var i=7; i>=0; i--) { v = (n>>>(i*4)) & 0xf; s += v.toString(16); }
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
/* Utf8 class: encode / decode between multi-byte Unicode characters and UTF-8 multiple */
|
||||
/* single-byte character encoding (c) Chris Veness 2002-2010 */
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
var Utf8 = {}; // Utf8 namespace
|
||||
|
||||
/**
|
||||
* Encode multi-byte Unicode string into utf-8 multiple single-byte characters
|
||||
* (BMP / basic multilingual plane only)
|
||||
*
|
||||
* Chars in range U+0080 - U+07FF are encoded in 2 chars, U+0800 - U+FFFF in 3 chars
|
||||
*
|
||||
* @param {String} strUni Unicode string to be encoded as UTF-8
|
||||
* @returns {String} encoded string
|
||||
*/
|
||||
Utf8.encode = function(strUni) {
|
||||
// use regular expressions & String.replace callback function for better efficiency
|
||||
// than procedural approaches
|
||||
var strUtf = strUni.replace(
|
||||
/[\u0080-\u07ff]/g, // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz
|
||||
function(c) {
|
||||
var cc = c.charCodeAt(0);
|
||||
return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); }
|
||||
);
|
||||
strUtf = strUtf.replace(
|
||||
/[\u0800-\uffff]/g, // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz
|
||||
function(c) {
|
||||
var cc = c.charCodeAt(0);
|
||||
return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); }
|
||||
);
|
||||
return strUtf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode utf-8 encoded string back into multi-byte Unicode characters
|
||||
*
|
||||
* @param {String} strUtf UTF-8 string to be decoded back to Unicode
|
||||
* @returns {String} decoded string
|
||||
*/
|
||||
Utf8.decode = function(strUtf) {
|
||||
// note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
|
||||
var strUni = strUtf.replace(
|
||||
/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, // 3-byte chars
|
||||
function(c) { // (note parentheses for precence)
|
||||
var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f);
|
||||
return String.fromCharCode(cc); }
|
||||
);
|
||||
strUni = strUni.replace(
|
||||
/[\u00c0-\u00df][\u0080-\u00bf]/g, // 2-byte chars
|
||||
function(c) { // (note parentheses for precence)
|
||||
var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f;
|
||||
return String.fromCharCode(cc); }
|
||||
);
|
||||
return strUni;
|
||||
}
|
||||
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
@ -2,6 +2,8 @@
|
|||
<head>
|
||||
<title>Dynastie</title>
|
||||
{% block head %} {% endblock %}
|
||||
<link href="{{ STATIC_URL }}css/dynastie.css" rel="stylesheet" type="text/css"/>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<a href="/user">Users</a> <a href="/blog">Blogs</a> <a href="/disconnect">Disconnect</a><br/><br/>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
{% else %}
|
||||
<table>
|
||||
{% for category in categories %}
|
||||
<tr><td>{{ category.id }}</td><td>{{ category.name }}</td><td><a href="/category/edit/{{ category.id }}">Edit</a></td><td><a href="/category/delete/{{ category.id }}">Delete</a></td></tr>
|
||||
<tr><td>{{ category.id }}</td><td>{{ category.name }}</td><td><a href="/category/edit/{{ category.id }}">Edit</a></td><td><a href="/category/delete/{{ category.id }}" onclick="return confirm('Do you really want to delete this item ?')">Delete</a></td></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endif %}
|
||||
|
|
|
@ -2,15 +2,20 @@
|
|||
|
||||
{% block content %}
|
||||
{% if edited %}
|
||||
<p style="color:green">User successfuly updated</p>
|
||||
<p class="edited">User successfuly updated</p>
|
||||
{% endif %}
|
||||
{% if user.is_superuser or user.id == user_to_edit.id %}
|
||||
<form action="/user/edit/{{ user_to_edit.id }}" method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<input type="submit" name="edit" value="Edit" /><input type="submit" name="cancel" value="Cancel" />
|
||||
<p><label for="id_password">Password:</label> <input id="id_password" type="text" name="password" maxlength="128" /></p>
|
||||
<input type="submit" name="edit" value="Edit" /><input type="submit" name="cancel" value="Cancel" />{% if user.is_superuser %}<input type="submit" name="delete" value="Delete" onclick="return confirm('Do you really want to delete this item ?')"/>{% endif %}
|
||||
</form>
|
||||
{% else %}
|
||||
<form action="/user/edit/{{ user_to_edit.id }}" method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<input type="submit" name="cancel" value="Cancel" />
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,24 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Dynastie</title>
|
||||
<script type="text/javascript" src="{{ STATIC_URL }}js/jsaes.js"></script>
|
||||
<script type="text/javascript" src="{{ STATIC_URL }}js/sha256.js"/></script>
|
||||
<script type="text/javascript" src="{{ STATIC_URL }}js/base64.js"/></script>
|
||||
<script type="text/javascript" language="javascript">
|
||||
<!--
|
||||
function encryptPassword()
|
||||
{
|
||||
var password = "{{ auth_key }};
|
||||
var plaintext = Sha256.hash(document.getElementById("password").value, false);
|
||||
//AES_Init();
|
||||
//AES_ExpandKey(password);
|
||||
//AES_Encrypt(plaintext, password);
|
||||
document.getElementById("password").value = Base64.encode(plaintext);
|
||||
//AES_Done();
|
||||
document.forms[0].submit();
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<style type="text/css">
|
||||
div.logo {
|
||||
margin-top:2%;
|
||||
|
@ -43,7 +25,7 @@
|
|||
<img src="{{ STATIC_URL }}images/logo.png"/>
|
||||
</div>
|
||||
<div class="form">
|
||||
<form method="post" action="/index" onSubmit="encryptPassword()">
|
||||
<form method="post" action="/index">
|
||||
{% csrf_token %}
|
||||
{% if login_failed %} <p id="login_failed">Login or password is invalid</p> {% endif %}
|
||||
<table>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
{% else %}
|
||||
<table>
|
||||
{% for tag in tags %}
|
||||
<tr><td>{{ tag.id }}</td><td>{{ tag.name }}</td><td><a href="/tag/edit/{{ tag.id }}">Edit</a></td><td><a href="/tag/delete/{{ tag.id }}">Delete</a></td></tr>
|
||||
<tr><td>{{ tag.id }}</td><td>{{ tag.name }}</td><td><a href="/tag/edit/{{ tag.id }}">Edit</a></td><td><a href="/tag/delete/{{ tag.id }}" onclick="return confirm('Do you really want to delete this item ?')">Delete</a></td></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endif %}
|
||||
|
|
|
@ -5,10 +5,10 @@
|
|||
<b>Any user available</b><br/><br/>
|
||||
{% else %}
|
||||
{% for user in users %}
|
||||
{% if user.first_name|length != 0 or user.last_name|length != 0%}
|
||||
{% if user.first_name != "" or user.last_name != "" %}
|
||||
<li><a href="/user/{{ user.id }}">{{ user.first_name }} {{ user.last_name }}</a></li>
|
||||
{% else %}
|
||||
<li><a href="/user/{{ user.id }}">{{ user.login }}</a></li>
|
||||
<li><a href="/user/{{ user.id }}">{{ user.username }}</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
|
|
@ -2,11 +2,14 @@
|
|||
|
||||
{% block content %}
|
||||
<a href="/blog/{{ blog.id }}?page=0">Home</a> <a href="/category/{{ blog.id }}">Categories</a> <a href="/tag/{{ blog.id }}">Tags</a>
|
||||
{% if edited %}
|
||||
<p class="edited">Blog successfuly updated</p>
|
||||
{% endif %}
|
||||
{% if user.is_superuser %}
|
||||
<form action="/blog/edit/{{ blog.id }}" method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<input type="submit" name="edit" value="Edit" /><input type="submit" name="delete" value="Delete" />
|
||||
<input type="submit" name="edit" value="Edit" /><input type="submit" name="delete" value="Delete" onclick="return confirm('Do you really want to delete this item ?')"/>
|
||||
</form>
|
||||
{% endif %}
|
||||
<br/><br/>
|
||||
|
@ -19,7 +22,7 @@
|
|||
<table>
|
||||
{% for post in posts %}
|
||||
{% with post.id as cur_id %}
|
||||
<tr><td><a href="/post/edit/{{ post.id }}">{{ post.id }}</a></td><td>{{ post.title }}</td><td>{{ post.category.name }}</td><td>{{ post.creation_date }}</td><td>{{ post.modification_date }}</td><td>{{ post.published }}</td><td>{{ post.front_page }}</td><td>{{ comments|hash:cur_id|default_if_none:"0" }} comment{{ comments|hash:cur_id|pluralize }}</td><td><a href="/post/delete/{{ post.id }}">Delete</a></td></tr>
|
||||
<tr><td><a href="/post/edit/{{ post.id }}">{{ post.id }}</a></td><td>{{ post.title }}</td><td>{{ post.category.name }}</td><td>{{ post.creation_date }}</td><td>{{ post.modification_date }}</td><td>{{ post.published }}</td><td>{{ post.front_page }}</td><td>{{ comments|hash:cur_id|default_if_none:"0" }} comment{{ comments|hash:cur_id|pluralize }}</td><td><a href="/post/delete/{{ post.id }}" onclick="return confirm('Do you really want to delete this item ?')">Delete</a></td></tr>
|
||||
{% endwith %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
|
204
views.py
204
views.py
|
@ -57,6 +57,8 @@ def have_I_right(request, blog_id=None, post_id=None, must_be_superuser=False):
|
|||
return (b, p)
|
||||
|
||||
def createNavigationBar(blog_id, cur_page, nb_pages):
|
||||
if nb_pages == 0: return ''
|
||||
|
||||
navigation_bar = ''
|
||||
if cur_page == 0:
|
||||
navigation_bar += '<< <'
|
||||
|
@ -73,7 +75,7 @@ def createNavigationBar(blog_id, cur_page, nb_pages):
|
|||
if cur_page == nb_pages:
|
||||
navigation_bar += ' > >>'
|
||||
else:
|
||||
navigation_bar += ' <a href="/blog/%d?page=%d">></a>' % (blog_id, nb_pages)
|
||||
navigation_bar += ' <a href="/blog/%d?page=%d">></a>' % (blog_id, cur_page+1)
|
||||
navigation_bar += ' <a href="/blog/%d?page=%d">>></a>' % (blog_id, nb_pages)
|
||||
|
||||
return navigation_bar
|
||||
|
@ -95,15 +97,13 @@ def index(request):
|
|||
else:
|
||||
return HttpResponseRedirect('/blog')
|
||||
|
||||
c = {'auth_key': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',\
|
||||
'login_failed' : login_failed}
|
||||
c = {'login_failed' : login_failed}
|
||||
|
||||
return render(request, 'templates/login.html', c)
|
||||
|
||||
def disconnect(request):
|
||||
logout(request)
|
||||
c = {'auth_key': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',\
|
||||
'login_failed' : False}
|
||||
c = {'login_failed' : False}
|
||||
return HttpResponseRedirect('/')
|
||||
|
||||
@login_required
|
||||
|
@ -119,25 +119,21 @@ def add_user(request):
|
|||
if not request.user.is_superuser:
|
||||
return HttpResponseRedirect('/user')
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
if request.method == 'POST':
|
||||
if 'add' in request.POST:
|
||||
form = UserForm(request.POST) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
form = UserForm(request.POST)
|
||||
if form.is_valid():
|
||||
form = form.save()
|
||||
user = User.objects.get(pk=form.id)
|
||||
user.set_password(request.POST['password'])
|
||||
user.save()
|
||||
# Process the data in form.cleaned_data
|
||||
# ...
|
||||
return HttpResponseRedirect('/user') # Redirect after POST
|
||||
return HttpResponseRedirect('/user')
|
||||
else:
|
||||
return HttpResponseRedirect('/user') # Redirect after POST
|
||||
return HttpResponseRedirect('/user')
|
||||
else:
|
||||
form = UserForm() # An unbound form
|
||||
form = UserForm()
|
||||
|
||||
return render(request, 'add_user.html', {
|
||||
'form': form,
|
||||
})
|
||||
return render(request, 'add_user.html', {'form': form})
|
||||
|
||||
@login_required
|
||||
def edit_user(request, user_id):
|
||||
|
@ -148,12 +144,12 @@ def edit_user(request, user_id):
|
|||
|
||||
edited = False
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
if request.method == 'POST':
|
||||
if int(user_id) != int(request.user.id) and (not request.user.is_superuser):
|
||||
return HttpResponseRedirect('/user/' + str(user_id))
|
||||
return HttpResponseRedirect('/user')
|
||||
if 'edit' in request.POST:
|
||||
form = UserForm(request.POST, instance=user, initial={'password':''}) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
form = UserForm(request.POST, instance=user, initial={'password':''})
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
if request.POST['password'] != '':
|
||||
user.set_password(request.POST['password'])
|
||||
|
@ -166,7 +162,7 @@ def edit_user(request, user_id):
|
|||
if 'cancel' in request.POST:
|
||||
return HttpResponseRedirect('/user')
|
||||
else:
|
||||
form = UserForm(instance=user, initial={'password':''}) # An unbound form
|
||||
form = UserForm(instance=user, initial={'password':''})
|
||||
|
||||
c = {'user_to_edit' : user, 'form' : form, 'edited' : edited}
|
||||
|
||||
|
@ -186,23 +182,19 @@ def category(request, blog_id):
|
|||
def add_category(request, blog_id):
|
||||
b,_ = have_I_right(request, blog_id)
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
if request.method == 'POST':
|
||||
if 'add' in request.POST:
|
||||
form = CategoryForm(request.POST) # A form bound to the POST data
|
||||
form = CategoryForm(request.POST)
|
||||
form.blog = b
|
||||
if form.is_valid(): # All validation rules pass
|
||||
if form.is_valid():
|
||||
form = form.save()
|
||||
# Process the data in form.cleaned_data
|
||||
# ...
|
||||
return HttpResponseRedirect('/category/' + str(b.id))
|
||||
else:
|
||||
return HttpResponseRedirect('/category/' + str(b.id))
|
||||
else:
|
||||
form = CategoryForm() # An unbound form
|
||||
form = CategoryForm()
|
||||
|
||||
return render(request, 'add_category.html', {
|
||||
'form': form,
|
||||
})
|
||||
return render(request, 'add_category.html', {'form': form})
|
||||
|
||||
@login_required
|
||||
def edit_category(request, category_id):
|
||||
|
@ -213,20 +205,20 @@ def edit_category(request, category_id):
|
|||
|
||||
b,_ = have_I_right(request, category.blog.id)
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
if request.method == 'POST':
|
||||
if 'cancel' in request.POST:
|
||||
return HttpResponseRedirect('/category' + str(b.id))
|
||||
return HttpResponseRedirect('/category/' + str(b.id))
|
||||
if 'edit' in request.POST:
|
||||
name = category.name
|
||||
name = name.strip()
|
||||
form = CategoryForm(request.POST, instance=category) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
form = CategoryForm(request.POST, instance=category)
|
||||
if form.is_valid():
|
||||
if request.POST['name'] != name:
|
||||
category.remove()
|
||||
category.remove(b)
|
||||
form.save()
|
||||
return HttpResponseRedirect('/category/' + str(b.id))
|
||||
else:
|
||||
form = CategoryForm(instance=category) # An unbound form
|
||||
form = CategoryForm(instance=category)
|
||||
|
||||
c = {'category' : category, 'form' : form}
|
||||
|
||||
|
@ -241,7 +233,7 @@ def delete_category(request, category_id):
|
|||
|
||||
b,_ = have_I_right(request, category.blog.id)
|
||||
|
||||
category.remove()
|
||||
category.remove(b)
|
||||
category.delete()
|
||||
|
||||
return HttpResponseRedirect('/category/' + str(b.id))
|
||||
|
@ -265,19 +257,19 @@ def edit_tag(request, tag_id):
|
|||
|
||||
b,_ = have_I_right(request, tag.blog.id)
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
if request.method == 'POST':
|
||||
if 'cancel' in request.POST:
|
||||
return HttpResponseRedirect('/blog/' + str(b.id))
|
||||
return HttpResponseRedirect('/tag/' + str(b.id))
|
||||
if 'edit' in request.POST:
|
||||
name = tag.name
|
||||
form = TagForm(request.POST, instance=tag) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
form = TagForm(request.POST, instance=tag)
|
||||
if form.is_valid():
|
||||
if request.POST['name'] != name:
|
||||
tag.remove(b)
|
||||
form.save()
|
||||
return HttpResponseRedirect('/blog/' + str(b.id))
|
||||
return HttpResponseRedirect('/tag/' + str(b.id))
|
||||
else:
|
||||
form = TagForm(instance=tag) # An unbound form
|
||||
form = TagForm(instance=tag)
|
||||
|
||||
c = {'tag' : tag, 'form' : form}
|
||||
|
||||
|
@ -295,7 +287,7 @@ def delete_tag(request, tag_id):
|
|||
tag.remove(b)
|
||||
tag.delete()
|
||||
|
||||
return HttpResponseRedirect('/blog/' + str(b.id))
|
||||
return HttpResponseRedirect('/tag/' + str(b.id))
|
||||
|
||||
@login_required
|
||||
def blog(request):
|
||||
|
@ -313,27 +305,26 @@ def add_blog(request):
|
|||
if not request.user.is_superuser:
|
||||
return HttpResponseRedirect('/blog')
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
if request.method == 'POST':
|
||||
if 'add' in request.POST:
|
||||
form = BlogForm(request.POST) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
form = BlogForm(request.POST)
|
||||
if form.is_valid():
|
||||
form = form.save()
|
||||
form.create()
|
||||
return HttpResponseRedirect('/blog') # Redirect after POST
|
||||
return HttpResponseRedirect('/blog')
|
||||
else:
|
||||
return HttpResponseRedirect('/blog') # Redirect after POST
|
||||
return HttpResponseRedirect('/blog')
|
||||
else:
|
||||
form = BlogForm() # An unbound form
|
||||
form = BlogForm()
|
||||
|
||||
return render(request, 'add_blog.html', {
|
||||
'form': form,
|
||||
})
|
||||
return render(request, 'add_blog.html', {'form': form})
|
||||
|
||||
@login_required
|
||||
def view_blog(request, blog_id):
|
||||
b,_ = have_I_right(request, blog_id)
|
||||
|
||||
count = Post.objects.filter(blog=b).count()
|
||||
posts = Post.objects.filter(blog=b)
|
||||
count = posts.count()
|
||||
nb_pages = int(count/50)
|
||||
if 'page' in request.GET:
|
||||
cur_page = int(request.GET['page'])
|
||||
|
@ -343,6 +334,7 @@ def view_blog(request, blog_id):
|
|||
else:
|
||||
cur_page = 0
|
||||
|
||||
# Prevent error injection
|
||||
if cur_page < 0 : cur_page = 0
|
||||
if cur_page > nb_pages : cur_page = nb_pages-1
|
||||
|
||||
|
@ -351,7 +343,7 @@ def view_blog(request, blog_id):
|
|||
start = cur_page * 50
|
||||
end = start + 50
|
||||
|
||||
posts = Post.objects.filter(blog=b).order_by('-creation_date')[start:end]
|
||||
posts = posts.order_by('-creation_date')[start:end]
|
||||
form = BlogForm(instance=b)
|
||||
|
||||
comments = Comment.objects.all()
|
||||
|
@ -379,22 +371,25 @@ def edit_blog(request, blog_id):
|
|||
if b is None:
|
||||
raise Http404
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
edited = False
|
||||
|
||||
if request.method == 'POST':
|
||||
if 'edit' in request.POST:
|
||||
form = BlogForm(request.POST, instance=b) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
form = BlogForm(request.POST, instance=b)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
edited = True
|
||||
else:
|
||||
if 'delete' in request.POST:
|
||||
b = Blog.objects.get(pk=blog_id)
|
||||
b.delete()
|
||||
return HttpResponseRedirect('/blog')
|
||||
else:
|
||||
form = BlogForm(instance=b) # An unbound form
|
||||
form = BlogForm(instance=b)
|
||||
|
||||
posts = Post.objects.filter(blog=b).order_by('-creation_date')
|
||||
|
||||
c = {'blog' : b, 'posts' : posts, 'form' : form}
|
||||
c = {'blog' : b, 'posts' : posts, 'form' : form, 'edited' : edited}
|
||||
|
||||
return render(request, 'templates/view_blog.html', c)
|
||||
|
||||
|
@ -402,28 +397,24 @@ def edit_blog(request, blog_id):
|
|||
def add_post(request, blog_id):
|
||||
(b,_) = have_I_right(request, blog_id)
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
if request.method == 'POST':
|
||||
if 'add' in request.POST:
|
||||
post = Post(blog=Blog.objects.get(pk=blog_id), author=User.objects.get(pk=request.user.id), creation_date=datetime.now(), modification_date=datetime.now())
|
||||
content = request.POST['content']
|
||||
# del request.POST['content']
|
||||
form = PostForm(request.POST, instance=post) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
form = PostForm(request.POST, instance=post)
|
||||
if form.is_valid():
|
||||
form = form.save()
|
||||
form.createPost(content, request.POST['text_tags'])
|
||||
s = Search()
|
||||
s.index_post(b, form.id)
|
||||
# Process the data in form.cleaned_data
|
||||
# ...
|
||||
return HttpResponseRedirect('/blog/' + blog_id) # Redirect after POST
|
||||
return HttpResponseRedirect('/blog/' + blog_id)
|
||||
else:
|
||||
return HttpResponseRedirect('/blog/' + blog_id) # Redirect after POST
|
||||
return HttpResponseRedirect('/blog/' + blog_id)
|
||||
else:
|
||||
form = PostForm() # An unbound form
|
||||
form = PostForm()
|
||||
|
||||
return render(request, 'add_post.html', {
|
||||
'form': form, 'blog_id' : blog_id
|
||||
})
|
||||
return render(request, 'add_post.html', {'form': form, 'blog_id' : blog_id})
|
||||
|
||||
@login_required
|
||||
def edit_post(request, post_id):
|
||||
|
@ -432,26 +423,23 @@ def edit_post(request, post_id):
|
|||
title = post.title
|
||||
blog_id = b.id
|
||||
|
||||
if request.method == 'POST': # If the form has been submitted...
|
||||
if request.method == 'POST':
|
||||
if 'edit' in request.POST:
|
||||
form = PostForm(request.POST, instance=post) # A form bound to the POST data
|
||||
if form.is_valid(): # All validation rules pass
|
||||
form = PostForm(request.POST, instance=post)
|
||||
if form.is_valid():
|
||||
if title != request.POST['title']:
|
||||
post.remove()
|
||||
form.save()
|
||||
post.createPost(request.POST['content'], request.POST['text_tags'])
|
||||
s = Search()
|
||||
s.edit_post(b, post_id)
|
||||
# Process the data in form.cleaned_data
|
||||
# ...
|
||||
return HttpResponseRedirect('/blog/' + str(blog_id)) # Redirect after POST
|
||||
return HttpResponseRedirect('/blog/' + str(blog_id))
|
||||
else:
|
||||
if 'cancel' in request.POST:
|
||||
return HttpResponseRedirect('/blog/' + str(blog_id)) # Redirect after POST
|
||||
return HttpResponseRedirect('/blog/' + str(blog_id))
|
||||
else:
|
||||
form = PostForm(instance=post, initial={'text_tags':', '.join((tag.name) for tag in post.tags.all())}) # An unbound form
|
||||
form = PostForm(instance=post, initial={'text_tags':', '.join((tag.name) for tag in post.tags.all())})
|
||||
|
||||
b.create_paths()
|
||||
filename = b.src_path + '/_post/' + str(post.pk)
|
||||
if os.path.exists(filename):
|
||||
f = open(filename, 'rb')
|
||||
|
@ -475,7 +463,7 @@ def delete_post(request, post_id):
|
|||
(b, post) = have_I_right(request, None, post_id)
|
||||
|
||||
s = Search()
|
||||
s.edit_post(b, post_id)
|
||||
s.delete_post(b, post_id)
|
||||
|
||||
post.delete()
|
||||
|
||||
|
@ -484,9 +472,9 @@ def delete_post(request, post_id):
|
|||
def _generate(request, blog_id, report):
|
||||
b,_ = have_I_right(request, blog_id)
|
||||
|
||||
count = Post.objects.filter(blog=b).count()
|
||||
nb_pages = int(count/50)
|
||||
posts = Post.objects.filter(blog=b).order_by('-creation_date')[0:50]
|
||||
posts = Post.objects.filter(blog=b).order_by('-creation_date')
|
||||
nb_pages = int(posts.count()/50)
|
||||
posts = posts[0:50]
|
||||
b = Blog.objects.get(pk=blog_id)
|
||||
form = BlogForm(instance=b)
|
||||
|
||||
|
@ -509,7 +497,6 @@ def _generate(request, blog_id, report):
|
|||
def generate(request, blog_id):
|
||||
b,_ = have_I_right(request, blog_id)
|
||||
|
||||
b.create_paths()
|
||||
report = b.generate()
|
||||
|
||||
return _generate(request, blog_id, report)
|
||||
|
@ -518,8 +505,6 @@ def generate(request, blog_id):
|
|||
def generate_search(request, blog_id):
|
||||
b,_ = have_I_right(request, blog_id)
|
||||
|
||||
b.create_paths()
|
||||
|
||||
s = Search()
|
||||
|
||||
report = s.create_index(b)
|
||||
|
@ -550,27 +535,25 @@ def search(request, blog_id):
|
|||
if post_list is None: post_list = []
|
||||
|
||||
s = search.Search()
|
||||
b.create_paths()
|
||||
|
||||
res = s.generate(b, b.src_path, b.output_path, post_list)
|
||||
|
||||
c = {'result' : res}
|
||||
|
||||
# Simple wrapper to HTML content
|
||||
return render(request, 'templates/search.html', c)
|
||||
|
||||
@login_required
|
||||
def preview(request, blog_id):
|
||||
from dynastie.generators import post
|
||||
|
||||
(b, p) = have_I_right(request, blog_id)
|
||||
|
||||
values = {'title' : request.POST['title'], \
|
||||
'author' : request.user.first_name + ' ' + request.user.last_name, \
|
||||
'content' : request.POST['content']
|
||||
}
|
||||
|
||||
(b, p) = have_I_right(request, blog_id)
|
||||
|
||||
b.create_paths()
|
||||
|
||||
engine = globals()['post']
|
||||
|
||||
for name, obj in inspect.getmembers(engine):
|
||||
|