Skip to content

Commit

Permalink
Merge branch 'master' of github.com:drtyhbo/drty
Browse files Browse the repository at this point in the history
  • Loading branch information
abinnewies committed Feb 2, 2011
2 parents d246853 + e8049db commit 9e08854
Show file tree
Hide file tree
Showing 19 changed files with 121 additions and 88 deletions.
13 changes: 13 additions & 0 deletions lib/conf/index.js
Expand Up @@ -35,6 +35,19 @@ exports.parseSettings = function(settings) {
}
}

function isInstalled(what, where) {
for (var i = 0; where[i] && where[i] != what; i++) {}
return i != where.length;
}

exports.isAppInstalled = function(app) {
return isInstalled(app, exports.settings.INSTALLED_APPS);
}

exports.isMiddlewareInstalled = function(middleware) {
return isInstalled(middleware, exports.settings.MIDDLEWARE_CLASSES);
}

exports.getSetting = function(setting, errorMessage) {
if (!(setting in exports.settings) && errorMessage) {
throw new Error(errorMessage);
Expand Down
2 changes: 1 addition & 1 deletion lib/contrib/admin/templates/change.tpl
Expand Up @@ -11,7 +11,7 @@

<div class="content">
<h3>Change {{ modelName }}</h3>
<form method="POST">
<form method="POST" enctype="multipart/form-data">
<table class="fields" border="1" cellspacing="0">
<col class="name"></col>
<col class="value"></col>
Expand Down
14 changes: 7 additions & 7 deletions lib/contrib/admin/views.js
Expand Up @@ -34,14 +34,12 @@ exports.adminLogin = function(request, response) {
form = new forms.LoginForm(request.POST);

form.clean(function(err) {
if (err) {
return render(form);
}
if (err) { return render(form); }

var User = drty.contrib.auth.models.User;
User.authenticate(form.username, form.password, function(error, user) {
if (error) {
render(form, error.message);
if (error || !user.isAdmin) {
render(form, error ? error.message : 'Admin privileges required');
} else {
user.login(request);
response.redirect(drty.urls.reverse('__adminHome'));
Expand Down Expand Up @@ -98,6 +96,7 @@ exports.adminChange = [
var Model = drty.db.models.getAll()[request.params.model];
if (!Model) {
response.redirect(drty.urls.reverse('__adminHome'));
return;
}

drty.utils.nav({
Expand Down Expand Up @@ -128,12 +127,13 @@ exports.adminChange = [
var form = new NewForm(request.POST, model);
form.save(function(err, form) {
if (err) {
return nav.render(form);
nav.render(form);
return;
}
if (form && !request.params.id) {
response.redirect(drty.urls.reverse('__adminChange',
request.params.model,
form.id));
form.model.id));
} else {
nav.render(form, model);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/contrib/auth/models.js
Expand Up @@ -19,7 +19,7 @@ var User = exports.User = models.Model.extend({
login: function(request) {
var drty = require('drty');

if (!drty.middleware.isInstalled(drty.contrib.auth.middleware.AuthMiddleware)) {
if (!drty.conf.isMiddlewareInstalled(drty.contrib.auth.middleware.AuthMiddleware)) {
console.log('WARNING: User.login() called but AuthMiddleware is not installed.');
}

Expand Down
6 changes: 5 additions & 1 deletion lib/contrib/sessions/middleware.js
Expand Up @@ -9,11 +9,15 @@ exports.SessionMiddleware = drty.Class.extend({
throw new Error('Configuration error. You must specify the following settings to use sessions:\n\
SESSION_ENGINE: [drty.conf.sessions.backends.cache | drty.conf.sessions.backends.db]');
}

if (!drty.conf.isAppInstalled(drty.contrib.sessions)) {
console.log('WARNING: SessionMiddleware used without drty.contrib.sessions in the INSTALLED_APPS list.\n');
}
},

handleRequest: function(request, response, next) {
var backend = drty.conf.settings.SESSION_ENGINE;

function onSessionLoaded(session) {
request.sessionId = sessionId;
request.session = session || {};
Expand Down
7 changes: 7 additions & 0 deletions lib/core/management/commands/shell.js
@@ -0,0 +1,7 @@
(function() {

require('./commands').add('shell', function(argv) {
require('repl').start('>>> ');
});

})();
5 changes: 4 additions & 1 deletion lib/core/management/commands/syncdb.js
Expand Up @@ -4,7 +4,10 @@ require('./commands').add('syncdb', function(argv) {
var drty = require('drty');

drty.utils.eachChained(drty.db.models.getAll(), function(name, Model, next) {
Model.sync(next);
Model.sync(function(err) {
if (err) { throw err; }
next();
});
});
});

Expand Down
4 changes: 2 additions & 2 deletions lib/core/validators.js
Expand Up @@ -55,12 +55,12 @@ function propertyValidator(isGt, reference, message, code, property) {

exports.maxValueValidator = function(maxValue) {
return propertyValidator(true, maxValue,
'Ensure the value is less than ' + maxValue, 'maxValue');
'Ensure the value is less than or equal to ' + maxValue, 'maxValue');
}

exports.minValueValidator = function(minValue) {
return propertyValidator(false, minValue,
'Ensure the value is greater than ' + minValue, 'minValue');
'Ensure the value is greater than or equal to ' + minValue, 'minValue');
}

exports.maxLengthValidator = function(maxLength) {
Expand Down
39 changes: 19 additions & 20 deletions lib/db/backends/mysql/columnmeta.js
Expand Up @@ -110,7 +110,7 @@ exports.JSONFieldMeta = ColumnMeta.extend({
sqlType: 'text',

toSQL: function(value) { return JSON.stringify(value); },
toJS: function(value) { return JSON.parse(value); }
toJS: function(value) { return value ? JSON.parse(value) : ''; }
});

exports.BooleanFieldMeta = ColumnMeta.extend({
Expand All @@ -126,28 +126,27 @@ exports.DateTimeFieldMeta = ColumnMeta.extend({
sqlType: 'datetime',

toSQL: function(value) {
if (value === null) {
return null;
}
return value === null ? null : drty.utils.strftime('%Y-%M-%D %H:%M:%S', value);
}
});

function pad(num) {
return num < 10
? '0' + num
: String(num);
}
var year = value.getFullYear(),
month = pad(value.getUTCMonth() + 1),
day = pad(value.getUTCDate()),
hour = pad(value.getUTCHours()),
min = pad(value.getUTCMinutes()),
sec = pad(value.getUTCSeconds());

return year + '-' + month + '-' + day + ' ' + hour + ':' + min + ':' + sec;
exports.DateFieldMeta = ColumnMeta.extend({
sqlType: 'date',

toSQL: function(value) {
return value === null ? null : drty.utils.strftime('%Y:%M:%D', value);
}
});

exports.ForeignKeyMeta = exports.IntegerFieldMeta.extend({
exports.TimeFieldMeta = ColumnMeta.extend({
sqlType: 'time',

toSQL: function(value) {
return value === null ? null : drty.utils.strftime('%H:%M:%S', value);
}
});

exports.ForeignKeyMeta = exports.IntegerFieldMeta.extend({
initialize: function(Model, column) {
this.parent(Model, column);
this.sqlName = column.getDbColumn() ||
Expand Down Expand Up @@ -177,8 +176,8 @@ exports.getMetaForColumn = function(Model, column) {
'BooleanField': exports.BooleanFieldMeta,
'NullBooleanField': exports.BooleanFieldMeta,
'DateTimeField': exports.DateTimeFieldMeta,
'DateField': exports.DateTimeFieldMeta,
'TimeField': exports.DateTimeFieldMeta,
'DateField': exports.DateFieldMeta,
'TimeField': exports.TimeFieldMeta,
'FileField': exports.CharFieldMeta,
'ImageField': exports.CharFieldMeta,
'ForeignKey': exports.ForeignKeyMeta
Expand Down
11 changes: 7 additions & 4 deletions lib/db/backends/mysql/index.js
Expand Up @@ -6,7 +6,6 @@ var drty = require('drty'),
exports.insert = function(model, callback) {
var insertSQL = new (require('./statements').Insert)(model);
dbpool.get(function(conn) {
// do the query
var q = conn.query(insertSQL.getSQL(), function(error, res) {
conn.close();
if (!error) {
Expand Down Expand Up @@ -93,8 +92,8 @@ exports.create = function(Model, callback) {
}

console.log("Creating table '" + Model.getTableName() + "'");
conn.query(create.getSQL(), function(error) {
if (callback) { callback(error); }
conn.query(create.getSQL(), function(err) {
if (callback) { callback(err); }
});
});
});
Expand All @@ -103,8 +102,13 @@ exports.create = function(Model, callback) {
exports.validate = function(Model, callback) {
var mysqlFieldTypes = {
0x01: 'tinyint',
0x02: 'smallint',
0x03: 'integer',
0x05: 'double',
0x0A: 'date',
0x0B: 'time',
0x0C: 'datetime',
0xF6: 'decimal',
0xFC: 'text',
0xFD: 'varchar'
};
Expand Down Expand Up @@ -136,7 +140,6 @@ exports.validate = function(Model, callback) {
if (!(sqlName in fields)) {
throw new Error("Error: Local column '" + name + "' not in database.");
}

var field = fields[sqlName];
if (column._mysql.getSqlType() != mysqlFieldTypes[field.type]) {
throw new Error("Error: Column '" + name + "' has an invalid type. Expected: " + mysqlFieldTypes[field.type]);
Expand Down
2 changes: 1 addition & 1 deletion lib/db/backends/mysql/test.columnmeta.js
Expand Up @@ -28,7 +28,7 @@ var MyModel = models.Model.extend({
DateField: new models.DateField(),
TimeField: new models.TimeField(),
ForeignKeyField: new models.ForeignKey(ForeignModel),
DecimalField: new models.DecimalField(8, 5),
DecimalField: new models.DecimalField({maxDigits: 8, decimalPlaces: 5}),
FileField: new models.FileField()
});

Expand Down
9 changes: 3 additions & 6 deletions lib/db/fields.js
Expand Up @@ -67,14 +67,11 @@ exports.FloatField = Field.extend({

exports.DecimalField = Field.extend({
_fieldType: 'DecimalField',
initialize: function(maxDigits, decimalPlaces, options) {
if (!maxDigits || !decimalPlaces) {
initialize: function(options) {
if (!options || !options.maxDigits || !options.decimalPlaces) {
throw new Error('Error: Must specify maxDigits and decimalPlaces parameters when using a DecimalField.');
}
this.parent(drty.utils.merge({
maxDigits: maxDigits,
decimalPlaces: decimalPlaces
}, options || {}));
this.parent(options);
},

getMaxDigits: function() { return this._options.maxDigits; },
Expand Down
20 changes: 10 additions & 10 deletions lib/db/modelform.js
Expand Up @@ -4,32 +4,32 @@ var drty = require('drty');

exports.ModelForm = drty.forms.Form.extend({
initialize: function(values, model) {
this.parent(values);
this.parent(values || model);
this.model = model;
},

save: function(cb) {
var model = this.model || new Model(),
var model = this.model || new this.Model(),
fields = this.getFields(),
columns = this.Model.getColumns();

// copy the values from this form into the model instance
for(var name in fields) {
var column = columns[name];
if (!column || column._fieldType == 'AutoField') {
if (this[name] || (column._fieldType != 'FileField'
&& column._fieldType != 'ImageField')) {
continue;
}
if (column._fieldType == 'FileField' && !this[name] && model[name]) {
this[name] = model[name];
}

model[name] = this[name];
this[name] = model[name];
}

this.clean(function(err) {
if (err) {
return cb(err, this);
cb(err, this);
return;
}

for(var name in fields) { model[name] = this[name]; }

model.save(function(err, model) {
if (err) {
cb(err, this);
Expand Down
7 changes: 1 addition & 6 deletions lib/db/models.js
Expand Up @@ -32,7 +32,7 @@ var Model = exports.Model = drty.Class.extend({

obj.__defineGetter__(name, getter);
obj.__defineSetter__(name, setter);
if (columns[name].isPrimaryKey) {
if (columns[name].isPrimaryKey()) {
obj.__defineGetter__('pk', getter);
obj.__defineSetter__('pk', setter);
}
Expand Down Expand Up @@ -88,11 +88,6 @@ var Model = exports.Model = drty.Class.extend({
options.label = options.verboseName;

switch(column._fieldType) {
case 'AutoField':
prop[name] = new drty.forms.IntegerField({required: false});
prop[name].widget = new drty.forms.widgets.HiddenInput();
break;

case 'IntegerField':
case 'PositiveIntegerField':
case 'SmallIntegerField':
Expand Down
8 changes: 6 additions & 2 deletions lib/forms/fields.js
Expand Up @@ -274,13 +274,17 @@ var DateTimeField = exports.DateTimeField = Field.extend({
},

toJS: function(value) {
return this.stringToDate(value);
return value ? this.stringToDate(value.trim()) : value;
},
fromJS: function(value) {
return drty.utils.strftime(this._options.format || this.defaultFormat, value);
return value && value.constructor == Date
? drty.utils.strftime(this._options.format || this.defaultFormat, value)
: value;
},

stringToDate: function(str) {
str = str.trim();

var inputFormats = this._options.inputFormats ||
this.defaultInputFormats;

Expand Down
5 changes: 2 additions & 3 deletions lib/forms/index.js
Expand Up @@ -62,16 +62,15 @@ var Form = exports.Form = drty.Class.extend({
cb(invalidFields.length
? new Error('The following fields do not validate: ' + invalidFields.join(', '))
: null);
});
}.bind(this));
},

fieldsToHTML: function(format) {
var rows = [];

var fields = this.getFields();
for (var name in fields) {
var field = fields[name],
value = (this[name] !== undefined && field.fromJS(this[name])) || '';
value = field.fromJS(this[name]);

if (field.widget.isHidden()) {
rows.push(field.widget.render(value));
Expand Down
9 changes: 0 additions & 9 deletions lib/middleware/index.js
Expand Up @@ -7,15 +7,6 @@ exports.add = function(middlewareObj) {
return this;
};

exports.isInstalled = function(middlewareObj) {
for (var i = 0; i < middleware.length; i++) {
if (middleware[i].constructor == middlewareObj) {
return true;
}
}
return false;
}

function runMiddleware(fncName, complete, lastToFirst) {
var args = Array.prototype.slice.call(arguments, 3),
list = middleware.slice();
Expand Down

0 comments on commit 9e08854

Please sign in to comment.