> A good question is though, what makes up a social networking site? What key
> features can be generalized and implemented by themselves as plugins?
The three essential elements of SNS are membership, relationship and
interaction.
Membership minimally entails a single permission set for the entire
site, i.e. UserX has PermissionY for all content of TypeZ throughout
the site. An expected feature of any SNS is that UserX would be able
to create and own content on the site in a way that enables him to
control access to that content.
Minimally, relationships consist of either a friendship meme or
follower meme. Friendship involves involves negotiation of a
reciprocal relationship, using resources to enforce a relationship
model that is less robust. As a consequence of this, the follower meme
is becoming more prevalent. The only problem with this is that sites
generally want to send only positive notifications, so if a user
wishes to enforce reciprocity then he is denied the tools to do so
effectively. Best implementation would be a site that gives
administrators the options of friends, followers or user-selected
friendship behavior with an administration set default.
Another desirable for SNS relationships in most applications is
groups. In its purest implementation, groups would be virtual members
with group membership mechanisms simply renamed. Robust groups permit
multiple owners and fine-grained permissions with sane defaults. I
would like to enable groups to own and join groups in order to enable
the formation of organic group structures. (Note to Ian: Work groups
as well as work flow inhibit user participation in CMS applications.
Currently available software doesn't implement the rich variety of
committees, sub-committees, joint committees, etc. and the fluid
movement in and out of these groups in real time in a realistic way.)
I think that Tortuga's i18n model contains some seed ideas for
implementation. A user registration is a generic object. His primary
profile, aliases and groups inherit the generic information, with
multiple inheritance for groups being a desirable.
Interaction happens over content, which is most often text. Most text
content consists of a title and a body. The primary difference between
text content types is in presentation. Presentation constraints may
consist of length or structural elements that are socially imposed,
imposed by the view, imposed by the data model or follow naturally
from the medium - For example mailing lists don't have an inherent per
message size limit, but for most topics there is a 4 paragraph cap on
constructive communications. Google groups is a good example of how
presentations are merging to reveal a fundamental unity in the
underlying content structure for Newsgroups, mailing list archives,
and forums. This trend is generally useful for concentrating content,
providing users the ability to interact seamlessly with others whose
choice of content tools might otherwise separate them, but it's still
useful to identify the input tools and permit the user to filter the
views by the source because a chat log may be structurally similar to
a Wiki discussion page, but there's a dramatic difference in the
quality of the content.
There are any number of ways to handle non-text content, the most
popular being embedding it in text and creating specialized content
handlers - for examples MIME and Facebook apps.
> To start, custom content form generation and custom queries would be a good
> places to start. That would allow for everything from blogs to forums to
> gallerys, etc. custom queries might also be able to handle content
> relations, allowing you to have a user view 10 other users with similar
> attributes as him (location, hobbies, religion, whatever).
>
> What else?
Decide whether SNS plugins on Tortuga should communicate via ODD or
OpenSocial. ODD is XML-only and fairly young, while OpenSocial
includes both XML and JSON specs and is backed by Google. I think that
the desirability or not of having a JSON definition is a more
important factor than whether to take the Google Kool-Aid, but I may
be alone at that table.
Once there is a tool (wizard?) for defining member profiles, the next
step is defining permissions. The default authorization structure from
TG2 (where a permission is a verb that applies to all the content of
of a given type on the site) may be sufficient for a CMS, but SNS
requires finer grained permissions. If it's not already done in
Tortuga, the authorization model has to be extended to include realms.
Ian, what is the auth model for Tortuga?
I also happen to think that user administration tools should be an
integral part of the design prior to release. The principle of least
privilege still applies even though we are trying to be expansive with
capabilities. It's OK to allow group owners or even individual users
to have access to form generation and custom queries through a web
interface, but allowing users to upload templates or define structures
(whether views or underlying data) in raw text could lead to injection
attacks. Most standard web-based textual SNS content can be derived
through the API that has already been exposed once the tools for
defining memberships and relationships are built (preferably to the
same API or one substantially similar), in other words the role of the
base SNS plug-in would simplify the creation of content-types web-
member and web-group. (The purpose of the 'web-' prefix being to
distinguish public content sources from sources of meta-content.)
Some extensions for SNS apps will probably fall back to the core
TurboGears functionality, for example the API exposed for document
creation would probably handle creating an RSS feed, but would not
handle mailing list integration.
Chris